diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2020-04-06 17:58:24 -0400 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2020-04-06 17:58:24 -0400 |
commit | c78101535b72b39cb58295e019c36d2de6b2c1da (patch) | |
tree | 9d2f35ffda417ae6d630b2a4b96b03ec922f7030 /src | |
parent | a622448029e7849361d2aabcd2138ed0de207dd1 (diff) |
Split quest_log.c
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_setup.c | 4 | ||||
-rw-r--r-- | src/diploma.c | 2 | ||||
-rw-r--r-- | src/field_control_avatar.c | 2 | ||||
-rw-r--r-- | src/field_effect.c | 10 | ||||
-rw-r--r-- | src/field_fadetransition.c | 6 | ||||
-rw-r--r-- | src/field_specials.c | 144 | ||||
-rw-r--r-- | src/help_message.c | 197 | ||||
-rw-r--r-- | src/load_save.c | 2 | ||||
-rw-r--r-- | src/new_menu_helpers.c | 9 | ||||
-rw-r--r-- | src/overworld.c | 50 | ||||
-rw-r--r-- | src/party_menu.c | 1 | ||||
-rw-r--r-- | src/quest_log.c | 2854 | ||||
-rw-r--r-- | src/quest_log_events.c | 2148 | ||||
-rw-r--r-- | src/start_menu.c | 1 | ||||
-rw-r--r-- | src/trainer_fan_club.c | 359 |
15 files changed, 2914 insertions, 2875 deletions
diff --git a/src/battle_setup.c b/src/battle_setup.c index 0b4c93868..171f9d794 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -794,13 +794,13 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_REMATCH_DOUBLE: - sub_811231C(); + FinishRecordingQuestLogScene(); TrainerBattleLoadArgs(sDoubleBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); return EventScript_TryDoDoubleRematchBattle; case TRAINER_BATTLE_REMATCH: - sub_811231C(); + FinishRecordingQuestLogScene(); TrainerBattleLoadArgs(sOrdinaryBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); diff --git a/src/diploma.c b/src/diploma.c index 5c653d071..e2e81c113 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -193,7 +193,7 @@ static void Task_DiplomaReturnToOverworld(u8 taskId) DestroyTask(taskId); FreeAllWindowBuffers(); FREE_AND_SET_NULL(gDiploma); - SetMainCallback2(sub_80568FC); + SetMainCallback2(CB2_ReturnToFieldFromDiploma); } static void DiplomaBgInit(void) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 9b6072fc8..694ef0392 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1085,7 +1085,7 @@ void HandleBoulderActivateVictoryRoadSwitch(u16 x, u16 y) { if (events[i].x + 7 == x && events[i].y + 7 == y) { - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); ScriptContext1_SetupScript(events[i].script); ScriptContext2_Enable(); } diff --git a/src/field_effect.c b/src/field_effect.c index bf68daa03..b89e9c116 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1105,7 +1105,7 @@ void FieldCB_FallWarpExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); ScriptContext2_Enable(); FreezeObjectEvents(); CreateTask(Task_FallWarpFieldEffect, 0); @@ -1409,7 +1409,7 @@ static void FieldCB_EscalatorWarpIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); ScriptContext2_Enable(); FreezeObjectEvents(); CreateTask(Task_EscalatorWarpInFieldEffect, 0); @@ -1819,7 +1819,7 @@ static void FieldCB_LavaridgeGymB1FWarpExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); ScriptContext2_Enable(); gFieldCallback = NULL; CreateTask(Task_LavaridgeGymB1FWarpExit, 0); @@ -2186,7 +2186,7 @@ static void FieldCallback_EscapeRopeExit(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); ScriptContext2_Enable(); FreezeObjectEvents(); gFieldCallback = NULL; @@ -2350,7 +2350,7 @@ static void FieldCallback_TeleportIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); ScriptContext2_Enable(); FreezeObjectEvents(); gFieldCallback = NULL; diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 28625d353..10f21bc0f 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -288,7 +288,7 @@ static void sub_807DF4C(bool8 a0) void FieldCB_DefaultWarpExit(void) { Overworld_PlaySpecialMapMusic(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); sub_807DE78(FALSE); ScriptContext2_Enable(); } @@ -296,7 +296,7 @@ void FieldCB_DefaultWarpExit(void) void FieldCB_WarpExitFadeFromBlack(void) { Overworld_PlaySpecialMapMusic(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); sub_807DE78(TRUE); ScriptContext2_Enable(); } @@ -305,7 +305,7 @@ static void FieldCB_TeleportWarpIn(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); - sub_8111CF0(); + QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(); PlaySE(SE_TK_WARPOUT); CreateTask(Task_TeleportWarpIn, 10); ScriptContext2_Enable(); diff --git a/src/field_specials.c b/src/field_specials.c index 90866071c..fe4845fab 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -95,7 +95,7 @@ static u8 *const sStringVarPtrs[] = { void ShowDiploma(void) { - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); SetMainCallback2(CB2_ShowDiploma); ScriptContext2_Enable(); } @@ -187,7 +187,7 @@ u8 GetLeadMonFriendship(void) void ShowTownMap(void) { - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); sub_80BFF50(1, CB2_ReturnToFieldContinueScriptPlayMapMusic); } @@ -1775,18 +1775,18 @@ bool8 DoesPlayerPartyContainSpecies(void) } static const u8 sMartMaps[][3] = { - {MAP_GROUP(VIRIDIAN_CITY_MART), MAP_NUM(VIRIDIAN_CITY_MART), 1}, - {MAP_GROUP(PEWTER_CITY_MART), MAP_NUM(PEWTER_CITY_MART), 3}, - {MAP_GROUP(CERULEAN_CITY_MART), MAP_NUM(CERULEAN_CITY_MART), 1}, - {MAP_GROUP(LAVENDER_TOWN_MART), MAP_NUM(LAVENDER_TOWN_MART), 1}, - {MAP_GROUP(VERMILION_CITY_MART), MAP_NUM(VERMILION_CITY_MART), 1}, - {MAP_GROUP(FUCHSIA_CITY_MART), MAP_NUM(FUCHSIA_CITY_MART), 1}, - {MAP_GROUP(CINNABAR_ISLAND_MART), MAP_NUM(CINNABAR_ISLAND_MART), 1}, - {MAP_GROUP(SAFFRON_CITY_MART), MAP_NUM(SAFFRON_CITY_MART), 1}, - {MAP_GROUP(THREE_ISLAND_MART), MAP_NUM(THREE_ISLAND_MART), 1}, - {MAP_GROUP(FOUR_ISLAND_MART), MAP_NUM(FOUR_ISLAND_MART), 1}, - {MAP_GROUP(SEVEN_ISLAND_MART), MAP_NUM(SEVEN_ISLAND_MART), 1}, - {MAP_GROUP(SIX_ISLAND_MART), MAP_NUM(SIX_ISLAND_MART), 1} + {MAP(VIRIDIAN_CITY_MART), 1}, + {MAP(PEWTER_CITY_MART), 3}, + {MAP(CERULEAN_CITY_MART), 1}, + {MAP(LAVENDER_TOWN_MART), 1}, + {MAP(VERMILION_CITY_MART), 1}, + {MAP(FUCHSIA_CITY_MART), 1}, + {MAP(CINNABAR_ISLAND_MART), 1}, + {MAP(SAFFRON_CITY_MART), 1}, + {MAP(THREE_ISLAND_MART), 1}, + {MAP(FOUR_ISLAND_MART), 1}, + {MAP(SEVEN_ISLAND_MART), 1}, + {MAP(SIX_ISLAND_MART), 1} }; u8 GetMartClerkObjectId(void) @@ -1811,57 +1811,57 @@ static const struct { u16 grp2; u16 num2; } sInsideOutsidePairs[51] = { - {MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN)}, - {MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN)}, - {MAP_GROUP(VIRIDIAN_CITY_GYM), MAP_NUM(VIRIDIAN_CITY_GYM), MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY)}, - {MAP_GROUP(ROUTE22_NORTH_ENTRANCE), MAP_NUM(ROUTE22_NORTH_ENTRANCE), MAP_GROUP(ROUTE22), MAP_NUM(ROUTE22)}, - {MAP_GROUP(ROUTE22_NORTH_ENTRANCE), MAP_NUM(ROUTE22_NORTH_ENTRANCE), MAP_GROUP(ROUTE23), MAP_NUM(ROUTE23)}, - {MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE), MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)}, - {MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE), MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE)}, - {MAP_GROUP(PEWTER_CITY_MUSEUM_1F), MAP_NUM(PEWTER_CITY_MUSEUM_1F), MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY)}, - {MAP_GROUP(PEWTER_CITY_GYM), MAP_NUM(PEWTER_CITY_GYM), MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY)}, - {MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4)}, - {MAP_GROUP(MT_MOON_B1F), MAP_NUM(MT_MOON_B1F), MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4)}, - {MAP_GROUP(CERULEAN_CITY_GYM), MAP_NUM(CERULEAN_CITY_GYM), MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY)}, - {MAP_GROUP(CERULEAN_CITY_BIKE_SHOP), MAP_NUM(CERULEAN_CITY_BIKE_SHOP), MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY)}, - {MAP_GROUP(ROUTE25_SEA_COTTAGE), MAP_NUM(ROUTE25_SEA_COTTAGE), MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25)}, - {MAP_GROUP(ROUTE5_POKEMON_DAY_CARE), MAP_NUM(ROUTE5_POKEMON_DAY_CARE), MAP_GROUP(ROUTE5), MAP_NUM(ROUTE5)}, - {MAP_GROUP(UNDERGROUND_PATH_NORTH_ENTRANCE), MAP_NUM(UNDERGROUND_PATH_NORTH_ENTRANCE), MAP_GROUP(ROUTE5), MAP_NUM(ROUTE5)}, - {MAP_GROUP(UNDERGROUND_PATH_SOUTH_ENTRANCE), MAP_NUM(UNDERGROUND_PATH_SOUTH_ENTRANCE), MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6)}, - {MAP_GROUP(VERMILION_CITY_POKEMON_FAN_CLUB), MAP_NUM(VERMILION_CITY_POKEMON_FAN_CLUB), MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY)}, - {MAP_GROUP(VERMILION_CITY_GYM), MAP_NUM(VERMILION_CITY_GYM), MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY)}, - {MAP_GROUP(SSANNE_1F_CORRIDOR), MAP_NUM(SSANNE_1F_CORRIDOR), MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY)}, - {MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_GROUP(ROUTE2), MAP_NUM(ROUTE2)}, - {MAP_GROUP(DIGLETTS_CAVE_SOUTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_SOUTH_ENTRANCE), MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11)}, - {MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10)}, - {MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10)}, - {MAP_GROUP(POWER_PLANT), MAP_NUM(POWER_PLANT), MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10)}, - {MAP_GROUP(POKEMON_TOWER_1F), MAP_NUM(POKEMON_TOWER_1F), MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN)}, - {MAP_GROUP(LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE), MAP_NUM(LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE), MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN)}, - {MAP_GROUP(LAVENDER_TOWN_HOUSE2), MAP_NUM(LAVENDER_TOWN_HOUSE2), MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN)}, - {MAP_GROUP(UNDERGROUND_PATH_EAST_ENTRANCE), MAP_NUM(UNDERGROUND_PATH_EAST_ENTRANCE), MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8)}, - {MAP_GROUP(UNDERGROUND_PATH_WEST_ENTRANCE), MAP_NUM(UNDERGROUND_PATH_WEST_ENTRANCE), MAP_GROUP(ROUTE7), MAP_NUM(ROUTE7)}, - {MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F), MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F), MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY)}, - {MAP_GROUP(CELADON_CITY_CONDOMINIUMS_1F), MAP_NUM(CELADON_CITY_CONDOMINIUMS_1F), MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY)}, - {MAP_GROUP(CELADON_CITY_GAME_CORNER), MAP_NUM(CELADON_CITY_GAME_CORNER), MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY)}, - {MAP_GROUP(CELADON_CITY_GYM), MAP_NUM(CELADON_CITY_GYM), MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY)}, - {MAP_GROUP(CELADON_CITY_RESTAURANT), MAP_NUM(CELADON_CITY_RESTAURANT), MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY)}, - {MAP_GROUP(ROCKET_HIDEOUT_B1F), MAP_NUM(ROCKET_HIDEOUT_B1F), MAP_GROUP(CELADON_CITY_GAME_CORNER), MAP_NUM(CELADON_CITY_GAME_CORNER)}, - {MAP_GROUP(SAFARI_ZONE_CENTER), MAP_NUM(SAFARI_ZONE_CENTER), MAP_GROUP(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE), MAP_NUM(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE)}, - {MAP_GROUP(FUCHSIA_CITY_GYM), MAP_NUM(FUCHSIA_CITY_GYM), MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY)}, - {MAP_GROUP(FUCHSIA_CITY_WARDENS_HOUSE), MAP_NUM(FUCHSIA_CITY_WARDENS_HOUSE), MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY)}, - {MAP_GROUP(SAFFRON_CITY_DOJO), MAP_NUM(SAFFRON_CITY_DOJO), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)}, - {MAP_GROUP(SAFFRON_CITY_GYM), MAP_NUM(SAFFRON_CITY_GYM), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)}, - {MAP_GROUP(SILPH_CO_1F), MAP_NUM(SILPH_CO_1F), MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY)}, - {MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20)}, - {MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20)}, - {MAP_GROUP(POKEMON_MANSION_1F), MAP_NUM(POKEMON_MANSION_1F), MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND)}, - {MAP_GROUP(CINNABAR_ISLAND_GYM), MAP_NUM(CINNABAR_ISLAND_GYM), MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND)}, - {MAP_GROUP(CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE), MAP_NUM(CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE), MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND)}, - {MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), MAP_GROUP(ROUTE23), MAP_NUM(ROUTE23)}, - {MAP_GROUP(VICTORY_ROAD_2F), MAP_NUM(VICTORY_ROAD_2F), MAP_GROUP(ROUTE23), MAP_NUM(ROUTE23)}, - {MAP_GROUP(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP_NUM(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR)}, - {MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY)} + [QL_LOCATION_HOME] = {MAP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP(PALLET_TOWN)}, + [QL_LOCATION_OAKS_LAB] = {MAP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP(PALLET_TOWN)}, + [QL_LOCATION_VIRIDIAN_GYM] = {MAP(VIRIDIAN_CITY_GYM), MAP(VIRIDIAN_CITY)}, + [QL_LOCATION_LEAGUE_GATE_1] = {MAP(ROUTE22_NORTH_ENTRANCE), MAP(ROUTE22)}, + [QL_LOCATION_LEAGUE_GATE_2] = {MAP(ROUTE22_NORTH_ENTRANCE), MAP(ROUTE23)}, + [QL_LOCATION_VIRIDIAN_FOREST_1] = {MAP(VIRIDIAN_FOREST), MAP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)}, + [QL_LOCATION_VIRIDIAN_FOREST_2] = {MAP(VIRIDIAN_FOREST), MAP(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE)}, + [QL_LOCATION_PEWTER_MUSEUM] = {MAP(PEWTER_CITY_MUSEUM_1F), MAP(PEWTER_CITY)}, + [QL_LOCATION_PEWTER_GYM] = {MAP(PEWTER_CITY_GYM), MAP(PEWTER_CITY)}, + [QL_LOCATION_MT_MOON_1] = {MAP(MT_MOON_1F), MAP(ROUTE4)}, + [QL_LOCATION_MT_MOON_2] = {MAP(MT_MOON_B1F), MAP(ROUTE4)}, + [QL_LOCATION_CERULEAN_GYM] = {MAP(CERULEAN_CITY_GYM), MAP(CERULEAN_CITY)}, + [QL_LOCATION_BIKE_SHOP] = {MAP(CERULEAN_CITY_BIKE_SHOP), MAP(CERULEAN_CITY)}, + [QL_LOCATION_BILLS_HOUSE] = {MAP(ROUTE25_SEA_COTTAGE), MAP(ROUTE25)}, + [QL_LOCATION_DAY_CARE] = {MAP(ROUTE5_POKEMON_DAY_CARE), MAP(ROUTE5)}, + [QL_LOCATION_UNDERGROUND_PATH_1] = {MAP(UNDERGROUND_PATH_NORTH_ENTRANCE), MAP(ROUTE5)}, + [QL_LOCATION_UNDERGROUND_PATH_2] = {MAP(UNDERGROUND_PATH_SOUTH_ENTRANCE), MAP(ROUTE6)}, + [QL_LOCATION_PKMN_FAN_CLUB] = {MAP(VERMILION_CITY_POKEMON_FAN_CLUB), MAP(VERMILION_CITY)}, + [QL_LOCATION_VERMILION_GYM] = {MAP(VERMILION_CITY_GYM), MAP(VERMILION_CITY)}, + [QL_LOCATION_SS_ANNE] = {MAP(SSANNE_1F_CORRIDOR), MAP(VERMILION_CITY)}, + [QL_LOCATION_DIGLETTS_CAVE_1] = {MAP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP(ROUTE2)}, + [QL_LOCATION_DIGLETTS_CAVE_2] = {MAP(DIGLETTS_CAVE_SOUTH_ENTRANCE), MAP(ROUTE11)}, + [QL_LOCATION_ROCK_TUNNEL_1] = {MAP(ROCK_TUNNEL_1F), MAP(ROUTE10)}, + [QL_LOCATION_ROCK_TUNNEL_2] = {MAP(ROCK_TUNNEL_1F), MAP(ROUTE10)}, + [QL_LOCATION_POWER_PLANT] = {MAP(POWER_PLANT), MAP(ROUTE10)}, + [QL_LOCATION_PKMN_TOWER] = {MAP(POKEMON_TOWER_1F), MAP(LAVENDER_TOWN)}, + [QL_LOCATION_VOLUNTEER_HOUSE] = {MAP(LAVENDER_TOWN_VOLUNTEER_POKEMON_HOUSE), MAP(LAVENDER_TOWN)}, + [QL_LOCATION_NAME_RATERS_HOUSE] = {MAP(LAVENDER_TOWN_HOUSE2), MAP(LAVENDER_TOWN)}, + [QL_LOCATION_UNDERGROUND_PATH_3] = {MAP(UNDERGROUND_PATH_EAST_ENTRANCE), MAP(ROUTE8)}, + [QL_LOCATION_UNDERGROUND_PATH_4] = {MAP(UNDERGROUND_PATH_WEST_ENTRANCE), MAP(ROUTE7)}, + [QL_LOCATION_CELADON_DEPT_STORE] = {MAP(CELADON_CITY_DEPARTMENT_STORE_1F), MAP(CELADON_CITY)}, + [QL_LOCATION_CELADON_MANSION] = {MAP(CELADON_CITY_CONDOMINIUMS_1F), MAP(CELADON_CITY)}, + [QL_LOCATION_GAME_CORNER] = {MAP(CELADON_CITY_GAME_CORNER), MAP(CELADON_CITY)}, + [QL_LOCATION_CELADON_GYM] = {MAP(CELADON_CITY_GYM), MAP(CELADON_CITY)}, + [QL_LOCATION_CELADON_RESTAURANT] = {MAP(CELADON_CITY_RESTAURANT), MAP(CELADON_CITY)}, + [QL_LOCATION_ROCKET_HIDEOUT] = {MAP(ROCKET_HIDEOUT_B1F), MAP(CELADON_CITY_GAME_CORNER)}, + [QL_LOCATION_SAFARI_ZONE] = {MAP(SAFARI_ZONE_CENTER), MAP(FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE)}, + [QL_LOCATION_FUCHSIA_GYM] = {MAP(FUCHSIA_CITY_GYM), MAP(FUCHSIA_CITY)}, + [QL_LOCATION_WARDENS_HOME] = {MAP(FUCHSIA_CITY_WARDENS_HOUSE), MAP(FUCHSIA_CITY)}, + [QL_LOCATION_FIGHTING_DOJO] = {MAP(SAFFRON_CITY_DOJO), MAP(SAFFRON_CITY)}, + [QL_LOCATION_SAFFRON_GYM] = {MAP(SAFFRON_CITY_GYM), MAP(SAFFRON_CITY)}, + [QL_LOCATION_SILPH_CO] = {MAP(SILPH_CO_1F), MAP(SAFFRON_CITY)}, + [QL_LOCATION_SEAFOAM_ISLANDS_1] = {MAP(SEAFOAM_ISLANDS_1F), MAP(ROUTE20)}, + [QL_LOCATION_SEAFOAM_ISLANDS_2] = {MAP(SEAFOAM_ISLANDS_1F), MAP(ROUTE20)}, + [QL_LOCATION_PKMN_MANSION] = {MAP(POKEMON_MANSION_1F), MAP(CINNABAR_ISLAND)}, + [QL_LOCATION_CINNABAR_GYM] = {MAP(CINNABAR_ISLAND_GYM), MAP(CINNABAR_ISLAND)}, + [QL_LOCATION_CINNABAR_LAB] = {MAP(CINNABAR_ISLAND_POKEMON_LAB_ENTRANCE), MAP(CINNABAR_ISLAND)}, + [QL_LOCATION_VICTORY_ROAD_1] = {MAP(VICTORY_ROAD_1F), MAP(ROUTE23)}, + [QL_LOCATION_VICTORY_ROAD_2] = {MAP(VICTORY_ROAD_2F), MAP(ROUTE23)}, + [QL_LOCATION_PKMN_LEAGUE] = {MAP(INDIGO_PLATEAU_POKEMON_CENTER_1F), MAP(INDIGO_PLATEAU_EXTERIOR)}, + [QL_LOCATION_CERULEAN_CAVE] = {MAP(CERULEAN_CAVE_1F), MAP(CERULEAN_CITY)} }; void sub_80CC534(void) @@ -1871,7 +1871,7 @@ void sub_80CC534(void) { if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].num) { - if (VarGet(VAR_0x404D) != 35 || i != 32) + if (VarGet(VAR_0x404D) != QL_LOCATION_ROCKET_HIDEOUT || i != QL_LOCATION_GAME_CORNER) { VarSet(VAR_0x404D, i); FlagSet(FLAG_0x808); @@ -1893,7 +1893,7 @@ void sub_80CC59C(void) sp0.unk1 = 0; if (FlagGet(FLAG_0x808)) { - if (r5 == 5) + if (r5 == QL_LOCATION_VIRIDIAN_FOREST_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE))) { @@ -1907,7 +1907,7 @@ void sub_80CC59C(void) return; } } - else if (r5 == 3) + else if (r5 == QL_LOCATION_LEAGUE_GATE_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23))) { @@ -1925,13 +1925,13 @@ void sub_80CC59C(void) { sp0.unk0 = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[r5].grp, sInsideOutsidePairs[r5].num)->regionMapSectionId; sp0.unk1 = r5; - if (r5 == 22) + if (r5 == QL_LOCATION_ROCK_TUNNEL_1) { PlayerGetDestCoords(&x, &y); if (x != 15 || y != 26) sp0.unk1++; } - else if (r5 == 42) + else if (r5 == QL_LOCATION_SEAFOAM_ISLANDS_1) { PlayerGetDestCoords(&x, &y); if (x != 67 || y != 15) @@ -1939,9 +1939,9 @@ void sub_80CC59C(void) } SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&sp0); FlagClear(FLAG_0x808); - if (r5 == 35) + if (r5 == QL_LOCATION_ROCKET_HIDEOUT) { - VarSet(VAR_0x404D, 32); + VarSet(VAR_0x404D, QL_LOCATION_GAME_CORNER); FlagSet(FLAG_0x808); } } diff --git a/src/help_message.c b/src/help_message.c new file mode 100644 index 000000000..ff85d1f82 --- /dev/null +++ b/src/help_message.c @@ -0,0 +1,197 @@ +#include "global.h" +#include "gflib.h" +#include "menu.h" + +static EWRAM_DATA u8 sHelpMessageWindowId = 0; + +const u16 gUnknown_84566A8[] = INCBIN_U16("data/graphics/unknown_84566a8.bin"); + +static const struct WindowTemplate sHelpMessageWindowTemplate = { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 15, + .width = 30, + .height = 5, + .paletteNum = 15, + .baseBlock = 0x08F +}; + +void MapNamePopupWindowIdSetDummy(void) +{ + sHelpMessageWindowId = 0xFF; +} + +u8 CreateHelpMessageWindow(void) +{ + if (sHelpMessageWindowId == 0xFF) + { + sHelpMessageWindowId = AddWindow(&sHelpMessageWindowTemplate); + PutWindowTilemap(sHelpMessageWindowId); + } + return sHelpMessageWindowId; +} + +void DestroyHelpMessageWindow(u8 a0) +{ + if (sHelpMessageWindowId != 0xFF) + { + FillWindowPixelBuffer(sHelpMessageWindowId, PIXEL_FILL(0)); + ClearWindowTilemap(sHelpMessageWindowId); + + if (a0) + CopyWindowToVram(sHelpMessageWindowId, a0); + + RemoveWindow(sHelpMessageWindowId); + sHelpMessageWindowId = 0xFF; + } +} + +#ifdef NONMATCHING +void sub_8112F18(u8 windowId) +{ + u8 width = GetWindowAttribute(windowId, WINDOW_WIDTH); + u8 height = GetWindowAttribute(windowId, WINDOW_HEIGHT); + u8 *buffer = Alloc(32 * width * height); + u8 i, j; + u8 k; + + if (buffer != NULL) + { + for (i = 0; i < height; i++) + { + for (j = 0; j < width; j++) + { + if (i == 0) + k = 0; + else if (i == height - 1) + k = 14; + else + k = 5; + CpuCopy32( + (void *)gUnknown_84566A8 + 32 * k, // operand swap on "add" instruction + buffer + 32 * (i * width + j), + 32 + ); + } + } + CopyToWindowPixelBuffer(windowId, buffer, width * height * 32, 0); + Free(buffer); + } +} +#else +NAKED +void sub_8112F18(u8 windowId) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x8\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tmovs r1, 0x3\n" + "\tbl GetWindowAttribute\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tmov r0, r10\n" + "\tmovs r1, 0x4\n" + "\tbl GetWindowAttribute\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tlsls r0, r7, 5\n" + "\tmuls r0, r6\n" + "\tbl Alloc\n" + "\tmov r8, r0\n" + "\tcmp r0, 0\n" + "\tbeq _08112FB8\n" + "\tmovs r5, 0\n" + "\tadds r0, r6, 0\n" + "\tmuls r0, r7\n" + "\tstr r0, [sp]\n" + "\tcmp r5, r7\n" + "\tbcs _08112FA2\n" + "_08112F5A:\n" + "\tmovs r4, 0\n" + "\tadds r1, r5, 0x1\n" + "\tmov r9, r1\n" + "\tcmp r4, r6\n" + "\tbcs _08112F98\n" + "\tsubs r3, r7, 0x1\n" + "_08112F66:\n" + "\tmovs r0, 0\n" + "\tcmp r5, 0\n" + "\tbeq _08112F74\n" + "\tmovs r0, 0x5\n" + "\tcmp r5, r3\n" + "\tbne _08112F74\n" + "\tmovs r0, 0xE\n" + "_08112F74:\n" + "\tlsls r0, 5\n" + "\tldr r1, _08112FC8 @ =gUnknown_84566A8\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r6\n" + "\tadds r1, r4\n" + "\tlsls r1, 5\n" + "\tadd r1, r8\n" + "\tldr r2, _08112FCC @ =0x04000008\n" + "\tstr r3, [sp, 0x4]\n" + "\tbl CpuSet\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp, 0x4]\n" + "\tcmp r4, r6\n" + "\tbcc _08112F66\n" + "_08112F98:\n" + "\tmov r1, r9\n" + "\tlsls r0, r1, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, r7\n" + "\tbcc _08112F5A\n" + "_08112FA2:\n" + "\tldr r0, [sp]\n" + "\tlsls r2, r0, 21\n" + "\tlsrs r2, 16\n" + "\tmov r0, r10\n" + "\tmov r1, r8\n" + "\tmovs r3, 0\n" + "\tbl CopyToWindowPixelBuffer\n" + "\tmov r0, r8\n" + "\tbl Free\n" + "_08112FB8:\n" + "\tadd sp, 0x8\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08112FC8: .4byte gUnknown_84566A8\n" + "_08112FCC: .4byte 0x04000008"); +} +#endif + +static void sub_8112FD0(void) +{ + sub_8112F18(sHelpMessageWindowId); +} + +static const u8 sHelpMessageTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GREY}; + +static void PrintHelpMessageText(const u8 *text) +{ + AddTextPrinterParameterized4(sHelpMessageWindowId, 2, 2, 5, 1, 1, sHelpMessageTextColors, -1, text); +} + +void PrintTextOnHelpMessageWindow(const u8 *text, u8 mode) +{ + sub_8112FD0(); + PrintHelpMessageText(text); + if (mode) + CopyWindowToVram(sHelpMessageWindowId, mode); +} diff --git a/src/load_save.c b/src/load_save.c index 9dff59928..859ec57af 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -78,7 +78,7 @@ void SetSaveBlocksPointers(void) gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset; SetBagPocketsPointers(); - sub_8110840(oldSave); + SetQuestLogRecordAndPlaybackPointers(oldSave); } void MoveSaveBlocks_ResetHeap(void) diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c index d8874548e..9ffef06ae 100644 --- a/src/new_menu_helpers.c +++ b/src/new_menu_helpers.c @@ -1,18 +1,13 @@ #include "global.h" -#include "malloc.h" -#include "dma3.h" -#include "task.h" -#include "bg.h" -#include "window.h" +#include "gflib.h" +#include "help_message.h" #include "menu.h" #include "menu_helpers.h" #include "new_menu_helpers.h" #include "quest_log.h" -#include "text.h" #include "field_specials.h" #include "text_window.h" #include "script.h" -#include "palette.h" #define DLG_WINDOW_PALETTE_NUM 15 #define DLG_WINDOW_BASE_TILE_NUM 0x200 diff --git a/src/overworld.c b/src/overworld.c index 742213ca2..a26d67b6e 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -160,9 +160,9 @@ static void SetCameraToTrackGuestPlayer_2(void); static void sub_8057178(void); static void sub_80571A8(void); static void CreateLinkPlayerSprites(void); -static void sub_80572D8(void); -static void sub_8057300(u8 *state); -static bool32 sub_8057314(u8 *state); +static void CB2_LoadMapForQLPlayback(void); +static void DoLoadMap_QLPlayback(u8 *state); +static bool32 LoadMap_QLPlayback(u8 *state); static bool32 SetUpScrollSceneForCredits(u8 *state, u8 unused); static bool8 MapLdr_Credits(void); static void CameraCB_CreditsPan(struct CameraObject * camera); @@ -340,7 +340,7 @@ static void Overworld_ResetStateAfterWhitingOut(void) VarSet(VAR_0x404D, 0); } -static void sub_8054E40(void) +static void Overworld_ResetStateOnContinue(void) { FlagClear(FLAG_SYS_SAFARI_MODE); VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); @@ -979,7 +979,7 @@ void SetCurrentMapLayout(u16 mapLayoutId) gMapHeader.mapLayout = GetMapLayout(); } -void sub_8055D5C(struct WarpData * warp) +void Overworld_SetWarpDestinationFromWarp(struct WarpData * warp) { sWarpDestination = *warp; } @@ -1441,7 +1441,7 @@ static void DoCB1_Overworld_QuestLogPlayback(void) RunQuestLogCB(); } } - else if (sub_8111CD0() == TRUE) + else if (QuestLogScenePlaybackIsEnding() == TRUE) { RunQuestLogCB(); } @@ -1555,7 +1555,7 @@ void CB2_WhiteOut(void) gFieldCallback = FieldCB_RushInjuredPokemonToCenter; val = 0; do_load_map_stuff_loop(&val); - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); @@ -1575,9 +1575,9 @@ void CB2_LoadMap(void) static void CB2_LoadMap2(void) { do_load_map_stuff_loop(&gMain.state); - if (sub_8113748() == TRUE) + if (QuestLog_ShouldEndSceneOnMapChange() == TRUE) { - sub_81119C8(); + QuestLog_AdvancePlayhead_(); } else { @@ -1671,14 +1671,14 @@ void CB2_ReturnToFieldContinueScriptPlayMapMusic(void) CB2_ReturnToField(); } -void sub_80568FC(void) +void CB2_ReturnToFieldFromDiploma(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_WarpExitFadeFromBlack; CB2_ReturnToField(); } -static void sub_8056918(void) +static void FieldCB_ShowMapNameOnContinue(void) { if (SHOW_MAP_NAME_ENABLED) ShowMapNamePopup(FALSE); @@ -1693,7 +1693,7 @@ void CB2_ContinueSavedGame(void) LoadSaveblockMapHeader(); LoadSaveblockObjEventScripts(); UnfreezeObjectEvents(); - sub_8054E40(); + Overworld_ResetStateOnContinue(); InitMapFromSavedGame(); PlayTimeCounter_Start(); ScriptContext1_Init(); @@ -1709,7 +1709,7 @@ void CB2_ContinueSavedGame(void) } else { - gFieldCallback = sub_8056918; + gFieldCallback = FieldCB_ShowMapNameOnContinue; SetMainCallback1(CB1_Overworld); CB2_ReturnToField(); } @@ -1861,7 +1861,7 @@ static bool32 load_map_stuff(u8 *state, bool32 a1) (*state)++; break; case 3: - if (sub_8113748() == TRUE) + if (QuestLog_ShouldEndSceneOnMapChange() == TRUE) return TRUE; (*state)++; break; @@ -2205,7 +2205,7 @@ static void CreateLinkPlayerSprites(void) // Quest Log -void sub_805726C(void) +void CB2_SetUpOverworldForQLPlaybackWithWarpExit(void) { FieldClearVBlankHBlankCallbacks(); gUnknown_2036E28 = 1; @@ -2213,10 +2213,10 @@ void sub_805726C(void) ScriptContext2_Disable(); SetMainCallback1(NULL); SetMainCallback2(CB2_DoChangeMap); - gMain.savedCallback = sub_80572D8; + gMain.savedCallback = CB2_LoadMapForQLPlayback; } -void sub_80572A8(void) +void CB2_SetUpOverworldForQLPlayback(void) { FieldClearVBlankHBlankCallbacks(); gUnknown_2036E28 = 1; @@ -2224,24 +2224,24 @@ void sub_80572A8(void) ScriptContext1_Init(); ScriptContext2_Disable(); SetMainCallback1(NULL); - SetMainCallback2(sub_80572D8); + SetMainCallback2(CB2_LoadMapForQLPlayback); } -static void sub_80572D8(void) +static void CB2_LoadMapForQLPlayback(void) { - sub_8057300(&gMain.state); + DoLoadMap_QLPlayback(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); SetMainCallback2(CB2_Overworld); } -static void sub_8057300(u8 *state) +static void DoLoadMap_QLPlayback(u8 *state) { - while (!sub_8057314(state)) + while (!LoadMap_QLPlayback(state)) ; } -static bool32 sub_8057314(u8 *state) +static bool32 LoadMap_QLPlayback(u8 *state) { switch (*state) { @@ -2317,7 +2317,7 @@ static bool32 sub_8057314(u8 *state) return FALSE; } -void sub_8057430(void) +void CB2_EnterFieldFromQuestLog(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); @@ -2326,7 +2326,7 @@ void sub_8057430(void) LoadSaveblockMapHeader(); LoadSaveblockObjEventScripts(); UnfreezeObjectEvents(); - sub_8054E40(); + Overworld_ResetStateOnContinue(); InitMapFromSavedGame(); PlayTimeCounter_Start(); ScriptContext1_Init(); diff --git a/src/party_menu.c b/src/party_menu.c index 5ceeb2c3b..fd90b3be7 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -19,6 +19,7 @@ #include "fieldmap.h" #include "fldeff.h" #include "graphics.h" +#include "help_message.h" #include "help_system.h" #include "item.h" #include "item_menu.h" diff --git a/src/quest_log.c b/src/quest_log.c index 40bd94265..e459c49fb 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -44,6 +44,7 @@ #include "constants/items.h" #include "constants/field_weather.h" #include "constants/event_object_movement.h" +#include "constants/region_map_sections.h" struct TrainerFanClub { @@ -60,24 +61,14 @@ struct TrainerFanClub struct UnkStruct_203AE94 { - u8 unk_0_0:4; - u8 unk_0_4:2; - u8 unk_0_6:2; - u8 unk_1; + u8 playbackSubstate:4; + u8 playingEvent:2; + u8 sceneEndMode:2; + u8 cursor; u8 unk_2; u8 unk_3; }; -struct QuestLogEntry -{ - u8 unk_0; - u8 unk_1; - u8 unk_2; - u8 unk_3; - u16 unk_4; - u8 unk_6; -}; - struct UnkStruct_300201C { u16 idx:15; @@ -85,13 +76,6 @@ struct UnkStruct_300201C u16 value; }; -struct UnkStruct_203B044 -{ - u8 unk_0; - u8 unk_1; - u16 unk_2; -}; - u8 gQuestLogPlaybackState; u16 sNumEventsInLogEntry; struct FieldInput gQuestLogFieldInput; @@ -105,25 +89,18 @@ static EWRAM_DATA u8 sNumScenes = 0; EWRAM_DATA u8 gQuestLogState = 0; static EWRAM_DATA u16 gUnknown_203ADFC = 0; static EWRAM_DATA u8 sQuestLogHeaderWindowIds[3] = {0}; -static EWRAM_DATA u16 *gUnknown_203AE04 = NULL; -static EWRAM_DATA u16 *sEventRecordingPointer = NULL; +EWRAM_DATA u16 *gUnknown_203AE04 = NULL; +EWRAM_DATA u16 *sEventRecordingPointer = NULL; static EWRAM_DATA u16 *gUnknown_203AE0C[32] = {NULL}; static EWRAM_DATA void (* sQuestLogCB)(void) = NULL; static EWRAM_DATA u16 *gUnknown_203AE90 = NULL; -static EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0}; +static EWRAM_DATA struct UnkStruct_203AE94 sQuestLogCurrentScene = {0}; static EWRAM_DATA struct QuestLogEntry sQuestLogSceneRecordBuffer[32] = {0}; -static EWRAM_DATA u16 sQuestLogCursor = 0; +EWRAM_DATA u16 sQuestLogCursor = 0; static EWRAM_DATA u8 sMovementScripts[64][2] = {{0}}; static EWRAM_DATA u16 sNextStepDelay = 0; static EWRAM_DATA u16 gUnknown_203B01C = 0; static EWRAM_DATA u16 sFlagOrVarPlayhead = 0; -static EWRAM_DATA u8 sHelpMessageWindowId = 0; -static EWRAM_DATA struct UnkStruct_203B024 gUnknown_203B024 = {0}; -static EWRAM_DATA struct UnkStruct_203B044 gUnknown_203B044 = {0}; -static EWRAM_DATA u8 gUnknown_203B048 = 0; -static EWRAM_DATA bool8 sNewlyEnteredMap = FALSE; -static EWRAM_DATA u8 gUnknown_203B04A = 0; -static EWRAM_DATA bool8 gUnknown_203B04B = FALSE; static void QLogCB_Recording(void); static void QLogCB_Playback(void); @@ -134,19 +111,19 @@ static void BackUpTrainerRematchesToVars(void); static void BackUpMapLayoutToVar(void); static void SetGameStateAtScene(u8); static u8 TryRecordQuestLogEntrySequence(struct QuestLogEntry *); -static void sub_8110F90(u8); +static void Task_BeginQuestLogPlayback(u8); static void QuestLogPlaybackSetObjectEventTemplates(u8); -static void sub_8111368(void); +static void QLPlayback_InitOverworldState(void); static void QuestLog_GetSaneMonCounts(void); static u16 QuestLog_GetSanePartyCount(void); static u16 QuestLog_GetSaneBoxCount(void); static void sub_8111688(void); -static void sub_811175C(u8, struct QuestLogEntry *); -static void sub_81118F4(s8); +static void ReadQuestLogScriptFromSav1(u8, struct QuestLogEntry *); +static void QuestLog_BeginFadeAtEndOfScene(s8 delay); static void QuestLog_AdvancePlayhead(void); static void QuestLog_StartFinalScene(void); static void Task_RunPlaybackCB(u8); -static void sub_8111AD8(void); +static void QuestLog_PlayCurrentEvent(void); static void sub_8111B80(void); static u8 sub_8111BD4(void); static void DrawQuestLogSceneDescription(void); @@ -154,8 +131,8 @@ static void sub_8111D90(u8); static void QuestLog_CloseTextWindow(void); static void QuestLog_SkipToEndOfPlayback(s8 delay); static void QuestLog_WaitFadeAndCancelPlayback(void); -static bool8 sub_8111F60(void); -static void sub_8111F8C(u8); +static bool8 FieldCB2_FinalScene(void); +static void Task_FinalScene_WaitFade(u8); static void Task_QuestLogScene_SavedGame(u8); static void Task_WaitAtEndOfQuestLog(u8); static void Task_EndQuestLog(u8); @@ -182,104 +159,6 @@ static bool8 sub_81137E4(u16, const u16 *); static u16 *sub_8113828(u16, const u16 *); static bool8 TrySetLinkQuestLogEvent(u16, const u16 *); static bool8 TrySetTrainerBattleQuestLogEvent(u16, const u16 *); -static void TryRecordEvent41_IncCursor(u16); -static void sub_811381C(void); -static bool8 IsQuestLogEventWithSpecialEncounterSpecies(u16, const u16 *); -static u16 *QuestLog_SkipCommand(u16 *, u16 **); -static void sub_8113ABC(const u16 *); -static bool8 sub_8113AE8(const u16 *); -static bool8 sub_8113B44(const u16 *); -static void sub_8113B88(void); -static void sub_8113B94(u16); -static void sub_8113BD8(void); -static u16 *TryRecordEvent39_NoParams(u16 *); -static u16 *sub_8113C20(u16 *, struct QuestLogEntry *); -static u16 *TryRecordEvent41(u16 *, u16); -static u16 *sub_8113C8C(u16 *, struct QuestLogEntry *); -static u16 *sub_8113CC8(u16 *, struct QuestLogEntry *); -static u16 *sub_8113D08(u16 *, struct QuestLogEntry *); -static u16 *sub_8113D48(u16 *, struct QuestLogEntry *); -static u16 *sub_8113D94(u16 *, struct QuestLogEntry *); -static u16 *BufferQuestLogData_SwitchedPartyOrder(u16 *, const u16 *); -static u16 *BufferQuestLogData_UsedItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_GaveHeldItemFromPartyMenu(u16 *, const u16 *); -static u16 *BufferQuestLogData_GaveHeldItemFromBagMenu(u16 *, const u16 *); -static u16 *BufferQuestLogData_GaveHeldItemFromPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_TookHeldItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwappedHeldItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwappedHeldItemFromPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_UsedPkmnCenter(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkTraded(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkBattledSingle(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkBattledDouble(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkBattledMulti(u16 *, const u16 *); -static u16 *BufferQuestLogData_UsedUnionRoom(u16 *, const u16 *); -static u16 *BufferQuestLogData_UsedUnionRoomChat(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *, const u16 *); -static u16 *BufferQuestLogData_LinkBattledUnionRoom(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwitchedMonsBetweenBoxes(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwitchedMonsWithinBox(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwitchedPartyMonForPCMon(u16 *, const u16 *); -static u16 *BufferQuestLogData_MovedMonBetweenBoxes(u16 *, const u16 *); -static u16 *BufferQuestLogData_MovedMonWithinBox(u16 *, const u16 *); -static u16 *BufferQuestLogData_WithdrewMonFromPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_DepositedMonInPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_SwitchedMultipleMons(u16 *, const u16 *); -static u16 *BufferQuestLogData_DepositedItemInPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_WithdrewItemFromPC(u16 *, const u16 *); -static u16 *BufferQuestLogData_DefeatedGymLeader(u16 *, const u16 *); -static u16 *BufferQuestLogData_DefeatedWildMon(u16 *, const u16 *); -static u16 *BufferQuestLogData_DefeatedEliteFourMember(u16 *, const u16 *); -static u16 *BufferQuestLogData_DefeatedChampion(u16 *, const u16 *); -static u16 *BufferQuestLogData_DefeatedTrainer(u16 *, const u16 *); -static u16 *BufferQuestLogData_DepartedLocation(u16 *, const u16 *); -static u16 *BufferQuestLogData_UsedFieldMove(u16 *, const u16 *); -static u16 *BufferQuestLogData_BoughtItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_SoldItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_ObtainedItem(u16 *, const u16 *); -static u16 *BufferQuestLogData_ArrivedInLocation(u16 *, const u16 *); -static const u16 *BufferQuestLogText_SwitchedPartyOrder(const u16 *); -static const u16 *BufferQuestLogText_UsedItem(const u16 *); -static const u16 *BufferQuestLogText_GaveHeldItemFromPartyMenu(const u16 *); -static const u16 *BufferQuestLogText_GaveHeldItemFromBagMenu(const u16 *); -static const u16 *BufferQuestLogText_GaveHeldItemFromPC(const u16 *); -static const u16 *BufferQuestLogText_TookHeldItem(const u16 *); -static const u16 *BufferQuestLogText_SwappedHeldItem(const u16 *); -static const u16 *BufferQuestLogText_SwappedHeldItemFromPC(const u16 *); -static const u16 *BufferQuestLogText_UsedPkmnCenter(const u16 *); -static const u16 *BufferQuestLogText_LinkTraded(const u16 *); -static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *); -static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *); -static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *); -static const u16 *BufferQuestLogText_UsedUnionRoom(const u16 *); -static const u16 *BufferQuestLogText_UsedUnionRoomChat(const u16 *); -static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *); -static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *); -static const u16 *BufferQuestLogText_SwitchedMonsBetweenBoxes(const u16 *); -static const u16 *BufferQuestLogText_SwitchedMonsWithinBox(const u16 *); -static const u16 *BufferQuestLogText_SwitchedPartyMonForPCMon(const u16 *); -static const u16 *BufferQuestLogText_MovedMonBetweenBoxes(const u16 *); -static const u16 *BufferQuestLogText_MovedMonWithinBox(const u16 *); -static const u16 *BufferQuestLogText_WithdrewMonFromPC(const u16 *); -static const u16 *BufferQuestLogText_DepositedMonInPC(const u16 *); -static const u16 *BufferQuestLogText_SwitchedMultipleMons(const u16 *); -static const u16 *BufferQuestLogText_DepositedItemInPC(const u16 *); -static const u16 *BufferQuestLogText_WithdrewItemFromPC(const u16 *); -static const u16 *BufferQuestLogText_DefeatedGymLeader(const u16 *); -static const u16 *BufferQuestLogText_DefeatedWildMon(const u16 *); -static const u16 *BufferQuestLogText_DefeatedEliteFourMember(const u16 *); -static const u16 *BufferQuestLogText_DefeatedChampion(const u16 *); -static const u16 *BufferQuestLogText_DefeatedTrainer(const u16 *); -static const u16 *BufferQuestLogText_DepartedLocation(const u16 *); -static const u16 *BufferQuestLogText_UsedFieldMove(const u16 *); -static const u16 *BufferQuestLogText_BoughtItem(const u16 *); -static const u16 *BufferQuestLogText_SoldItem(const u16 *); -static const u16 *BufferQuestLogText_ObtainedItem(const u16 *); -static const u16 *BufferQuestLogText_ArrivedInLocation(const u16 *); -static bool8 IsSpeciesFromSpecialEncounter(u16); -static bool8 sub_81153A8(u16, const u16 *); -static bool8 sub_81153E4(u16, const u16 *); -static void BufferLinkPartnersName(u8 *); static const struct WindowTemplate sQuestLogHeaderWindowTemplates[3] = { { 0, 0, 0, 30, 2, 15, 0x0e9 }, @@ -293,7 +172,7 @@ static const u16 gUnknown_8456638[] = INCBIN_U16("data/graphics/unknown_8456638. static const u8 sQuestLogTextLineYCoords[] = {17, 10, 3}; -void sub_8110840(void * oldPointer) +void SetQuestLogRecordAndPlaybackPointers(void * oldPointer) { ptrdiff_t offset = (void *)gSaveBlock1Ptr - oldPointer; if (gUnknown_203AE04) @@ -351,7 +230,7 @@ bool8 sub_8110944(const void * a0, size_t cmdSize) return TRUE; } -static bool8 WillCommandOfSizeFitInSav1Record(u16 *cursor, size_t size) +bool8 WillCommandOfSizeFitInSav1Record(u16 *cursor, size_t size) { void * start = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script; void * end = gSaveBlock1Ptr->questLog[sCurrentSceneNum].end; @@ -383,18 +262,21 @@ static void QLogCB_Recording(void) static void QLogCB_Playback(void) { - if (gUnknown_203AE94.unk_0_0 == 2) - gUnknown_203AE94.unk_0_0 = 0; + if (sQuestLogCurrentScene.playbackSubstate == 2) + sQuestLogCurrentScene.playbackSubstate = 0; - if (gUnknown_203AE94.unk_0_6 == 0) + if (sQuestLogCurrentScene.sceneEndMode == 0) { - if (gQuestLogPlaybackState || gUnknown_203AE94.unk_0_0 == 1 || (gUnknown_203AE94.unk_1 < NELEMS(gUnknown_203AE0C) && gUnknown_203AE0C[gUnknown_203AE94.unk_1] != NULL)) - sub_8111AD8(); + if (gQuestLogPlaybackState != 0 + || sQuestLogCurrentScene.playbackSubstate == 1 + || (sQuestLogCurrentScene.cursor < NELEMS(gUnknown_203AE0C) + && gUnknown_203AE0C[sQuestLogCurrentScene.cursor] != NULL)) + QuestLog_PlayCurrentEvent(); else { - gUnknown_203AE94.unk_0_6 = 2; + sQuestLogCurrentScene.sceneEndMode = 2; ScriptContext2_Enable(); - sub_81118F4(0); + QuestLog_BeginFadeAtEndOfScene(0); } } } @@ -409,13 +291,13 @@ u8 GetQuestLogStartType(void) return gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType; } -static void StartRecordingQuestLogEntry(u16 eventId) +void StartRecordingQuestLogEntry(u16 eventId) { if (sCurrentSceneNum >= QUEST_LOG_SCENE_COUNT) sCurrentSceneNum = 0; DestroySav1QuestLogEntry(sCurrentSceneNum); - sub_8113B88(); + ResetUnk203B044(); sEventRecordingPointer = gSaveBlock1Ptr->questLog[sCurrentSceneNum].script; if (IS_LINK_QL_EVENT(eventId) || eventId == QL_EVENT_DEPARTED) gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType = QL_START_WARP; @@ -565,7 +447,7 @@ void TrySetUpQuestLogScenes_ElseContinueFromSave(u8 taskId) if (sNumScenes != 0) { gHelpSystemEnabled = FALSE; - sub_8110F90(taskId); + Task_BeginQuestLogPlayback(taskId); DestroyTask(taskId); } else @@ -575,21 +457,21 @@ void TrySetUpQuestLogScenes_ElseContinueFromSave(u8 taskId) } } -static void sub_8110F90(u8 unused) +static void Task_BeginQuestLogPlayback(u8 taskId) { - gSaveBlock1Ptr->location.mapGroup = 3; - gSaveBlock1Ptr->location.mapNum = 19; + gSaveBlock1Ptr->location.mapGroup = MAP_GROUP(ROUTE1); + gSaveBlock1Ptr->location.mapNum = MAP_NUM(ROUTE1); gSaveBlock1Ptr->location.warpId = -1; sCurrentSceneNum = 0; gDisableMapMusicChangeOnMapLoad = 1; DisableWildEncounters(TRUE); - sub_8111368(); + QLPlayback_InitOverworldState(); } void sub_8110FCC(void) { - sub_811175C(sCurrentSceneNum, sQuestLogSceneRecordBuffer); - sub_8113B88(); + ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogSceneRecordBuffer); + ResetUnk203B044(); SetUpQuestLogEntry(1, sQuestLogSceneRecordBuffer, 0x100); QuestLogPlaybackSetObjectEventTemplates(sCurrentSceneNum); } @@ -599,8 +481,8 @@ static bool8 FieldCB2_QuestLogStartPlaybackWithWarpExit(void) LoadPalette(stdpal_get(4), 0xF0, 0x20); SetQuestLogState(QL_STATE_PLAYBACK); FieldCB_DefaultWarpExit(); - gUnknown_203AE94 = (struct UnkStruct_203AE94){}; - gUnknown_203AE94.unk_0_0 = 2; + sQuestLogCurrentScene = (struct UnkStruct_203AE94){}; + sQuestLogCurrentScene.playbackSubstate = 2; return 1; } @@ -609,8 +491,8 @@ static bool8 FieldCB2_QuestLogStartPlaybackStandingInPlace(void) LoadPalette(stdpal_get(4), 0xF0, 0x20); SetQuestLogState(QL_STATE_PLAYBACK); FieldCB_WarpExitFadeFromBlack(); - gUnknown_203AE94 = (struct UnkStruct_203AE94){}; - gUnknown_203AE94.unk_0_0 = 2; + sQuestLogCurrentScene = (struct UnkStruct_203AE94){}; + sQuestLogCurrentScene.playbackSubstate = 2; return 1; } @@ -669,11 +551,11 @@ static void QuestLogPlaybackSetObjectEventTemplates(u8 sceneNum) SetSav1ObjectEventsFromQuestLog(questLog, gSaveBlock1Ptr->objectEventTemplates); } -void sub_8111274(u8 sceneNum, bool8 a1) +static void QLPlayback_SetInitialPlayerPosition(u8 sceneNum, bool8 isWarp) { struct WarpData sp0; - if (!a1) + if (!isWarp) { gSaveBlock1Ptr->location.mapGroup = gSaveBlock1Ptr->questLog[sceneNum].mapGroup; gSaveBlock1Ptr->location.mapNum = gSaveBlock1Ptr->questLog[sceneNum].mapNum; @@ -688,11 +570,11 @@ void sub_8111274(u8 sceneNum, bool8 a1) sp0.warpId = gSaveBlock1Ptr->questLog[sceneNum].warpId; sp0.x = gSaveBlock1Ptr->questLog[sceneNum].x; sp0.y = gSaveBlock1Ptr->questLog[sceneNum].y; - sub_8055D5C(&sp0); + Overworld_SetWarpDestinationFromWarp(&sp0); } } -static void sub_8111368(void) +static void QLPlayback_InitOverworldState(void) { gQuestLogState = QL_STATE_PLAYBACK; ResetSpecialVars(); @@ -700,16 +582,16 @@ static void sub_8111368(void) ClearPCItemSlots(); if (GetQuestLogStartType() == QL_START_NORMAL) { - sub_8111274(sCurrentSceneNum, FALSE); + QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, FALSE); gFieldCallback2 = FieldCB2_QuestLogStartPlaybackStandingInPlace; - SetMainCallback2(sub_80572A8); + SetMainCallback2(CB2_SetUpOverworldForQLPlayback); } else { - sub_8111274(sCurrentSceneNum, TRUE); + QLPlayback_SetInitialPlayerPosition(sCurrentSceneNum, TRUE); WarpIntoMap(); gFieldCallback2 = FieldCB2_QuestLogStartPlaybackWithWarpExit; - SetMainCallback2(sub_805726C); + SetMainCallback2(CB2_SetUpOverworldForQLPlaybackWithWarpExit); } } @@ -871,7 +753,7 @@ void sub_8111708(void) } } -static void sub_811175C(u8 sceneNum, struct QuestLogEntry * a1) +static void ReadQuestLogScriptFromSav1(u8 sceneNum, struct QuestLogEntry * a1) { u16 i; u16 *r4; @@ -918,9 +800,9 @@ static void sub_811175C(u8 sceneNum, struct QuestLogEntry * a1) } } -static void sub_81118F4(s8 a0) +static void QuestLog_BeginFadeAtEndOfScene(s8 delay) { - FadeScreen(FADE_TO_BLACK, a0); + FadeScreen(FADE_TO_BLACK, delay); sQuestLogCB = QuestLog_AdvancePlayhead; } @@ -932,7 +814,7 @@ static void QuestLog_AdvancePlayhead(void) if (++sCurrentSceneNum < QUEST_LOG_SCENE_COUNT && gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType != 0) { sNumScenes--; - sub_8111368(); + QLPlayback_InitOverworldState(); } else { @@ -947,14 +829,14 @@ static void QuestLog_StartFinalScene(void) ResetSpecialVars(); Save_ResetSaveCounters(); Save_LoadGameData(SAVE_NORMAL); - SetMainCallback2(sub_8057430); - gFieldCallback2 = sub_8111F60; + SetMainCallback2(CB2_EnterFieldFromQuestLog); + gFieldCallback2 = FieldCB2_FinalScene; FreeAllWindowBuffers(); gQuestLogState = QL_STATE_PLAYBACK_LAST; sQuestLogCB = NULL; } -void sub_81119C8(void) +void QuestLog_AdvancePlayhead_(void) { QuestLog_AdvancePlayhead(); } @@ -966,7 +848,7 @@ bool8 QuestLog_SchedulePlaybackCB(void (*callback)(void)) switch (gQuestLogState) { case QL_STATE_RECORDING: - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); break; case QL_STATE_PLAYBACK: gQuestLogPlaybackState = 3; @@ -990,7 +872,7 @@ static void Task_RunPlaybackCB(u8 taskId) if (++data[0] == 0x7F) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gUnknown_203AE94.unk_0_6 = 2; + sQuestLogCurrentScene.sceneEndMode = 2; data[1]++; } break; @@ -1008,46 +890,46 @@ static void Task_RunPlaybackCB(u8 taskId) } } -static void sub_8111AD8(void) +static void QuestLog_PlayCurrentEvent(void) { - if (gUnknown_203AE94.unk_0_0 == 1) + if (sQuestLogCurrentScene.playbackSubstate == 1) { - if (--gUnknown_203AE94.unk_2 != 0) + if (--sQuestLogCurrentScene.unk_2 != 0) return; - gUnknown_203AE94.unk_0_0 = 0; - gUnknown_203AE94.unk_0_4 = 1; + sQuestLogCurrentScene.playbackSubstate = 0; + sQuestLogCurrentScene.playingEvent = 1; sub_8112888(2); } - if (gUnknown_203AE94.unk_0_4 == 1) + if (sQuestLogCurrentScene.playingEvent == 1) { - if (++gUnknown_203AE94.unk_3 > 15) + if (++sQuestLogCurrentScene.unk_3 > 15) { QuestLog_CloseTextWindow(); - gUnknown_203AE94.unk_0_4 = 0; - gUnknown_203AE94.unk_3 = 0; + sQuestLogCurrentScene.playingEvent = 0; + sQuestLogCurrentScene.unk_3 = 0; } } - if (gUnknown_203AE94.unk_1 < NELEMS(gUnknown_203AE0C)) + if (sQuestLogCurrentScene.cursor < NELEMS(gUnknown_203AE0C)) { - if (sub_8113B44(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1) + if (sub_8113B44(gUnknown_203AE0C[sQuestLogCurrentScene.cursor]) == 1) sub_8111B80(); - else if (sub_8113AE8(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1) + else if (sub_8113AE8(gUnknown_203AE0C[sQuestLogCurrentScene.cursor]) == 1) sub_8111B80(); } } static void sub_8111B80(void) { - if (gUnknown_203AE94.unk_0_0 == 0) + if (sQuestLogCurrentScene.playbackSubstate == 0) { - gUnknown_203AE94.unk_0_0 = 1; - gUnknown_203AE94.unk_0_4 = 0; - gUnknown_203AE94.unk_3 = 0; - gUnknown_203AE94.unk_2 = sub_8111BD4(); + sQuestLogCurrentScene.playbackSubstate = 1; + sQuestLogCurrentScene.playingEvent = 0; + sQuestLogCurrentScene.unk_3 = 0; + sQuestLogCurrentScene.unk_2 = sub_8111BD4(); if (gUnknown_203B044.unk_2 == 0) - gUnknown_203AE94.unk_1++; - if (gUnknown_203AE94.unk_1 > 32) + sQuestLogCurrentScene.cursor++; + if (sQuestLogCurrentScene.cursor > 32) return; DrawQuestLogSceneDescription(); } @@ -1078,38 +960,38 @@ bool8 sub_8111C2C(void) { if (gQuestLogState != QL_STATE_PLAYBACK) return FALSE; - if (gQuestLogPlaybackState == 0 || gUnknown_203AE94.unk_0_0 == 1 || gUnknown_203AE94.unk_0_0 == 2) + if (gQuestLogPlaybackState == 0 || sQuestLogCurrentScene.playbackSubstate == 1 || sQuestLogCurrentScene.playbackSubstate == 2) return TRUE; return FALSE; } void sub_8111C68(void) { - if (gUnknown_203AE94.unk_0_6 == 0) + if (sQuestLogCurrentScene.sceneEndMode == 0) { if (JOY_NEW(A_BUTTON)) { - gUnknown_203AE94.unk_0_6 = 2; + sQuestLogCurrentScene.sceneEndMode = 2; gQuestLogPlaybackState = 0; - sub_81118F4(-3); + QuestLog_BeginFadeAtEndOfScene(-3); } else if (JOY_NEW(B_BUTTON)) { - gUnknown_203AE94.unk_0_6 = 1; + sQuestLogCurrentScene.sceneEndMode = 1; gQuestLogPlaybackState = 0; QuestLog_SkipToEndOfPlayback(-3); } } } -bool8 sub_8111CD0(void) +bool8 QuestLogScenePlaybackIsEnding(void) { - if (gUnknown_203AE94.unk_0_6 != 0) + if (sQuestLogCurrentScene.sceneEndMode != 0) return TRUE; return FALSE; } -void sub_8111CF0(void) +void QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void) { if (gQuestLogState == QL_STATE_PLAYBACK) DrawPreviouslyOnQuestHeader(sNumScenes); @@ -1193,7 +1075,7 @@ static void QuestLog_WaitFadeAndCancelPlayback(void) { if (gSaveBlock1Ptr->questLog[sCurrentSceneNum].startType == 0) break; - sub_811175C(sCurrentSceneNum, sQuestLogSceneRecordBuffer); + ReadQuestLogScriptFromSav1(sCurrentSceneNum, sQuestLogSceneRecordBuffer); } gQuestLogPlaybackState = 0; QuestLog_StartFinalScene(); @@ -1211,16 +1093,16 @@ void sub_8111F38(u16 a0, u16 a1) CpuSet(gPlttBufferUnfaded + a0, gUnknown_203AE90 + a0, a1); } -static bool8 sub_8111F60(void) +static bool8 FieldCB2_FinalScene(void) { LoadPalette(stdpal_get(4), 0xF0, 0x20); DrawPreviouslyOnQuestHeader(0); FieldCB_WarpExitFadeFromBlack(); - CreateTask(sub_8111F8C, 0xFF); + CreateTask(Task_FinalScene_WaitFade, 0xFF); return TRUE; } -static void sub_8111F8C(u8 taskId) +static void Task_FinalScene_WaitFade(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1240,7 +1122,7 @@ static void Task_QuestLogScene_SavedGame(u8 taskId) if (!gPaletteFade.active) { - if (gUnknown_203AE94.unk_0_6 != 1) + if (sQuestLogCurrentScene.sceneEndMode != 1) { GetMapNameGeneric(gStringVar1, gMapHeader.regionMapSectionId); StringExpandPlaceholders(gStringVar4, gText_QuestLog_SavedGameAtLocation); @@ -1260,7 +1142,7 @@ static void Task_WaitAtEndOfQuestLog(u8 taskId) { struct Task *task = &gTasks[taskId]; - if (JOY_NEW(A_BUTTON | B_BUTTON) || task->tTimer >= 127 || gUnknown_203AE94.unk_0_6 == 1) + if (JOY_NEW(A_BUTTON | B_BUTTON) || task->tTimer >= 127 || sQuestLogCurrentScene.sceneEndMode == 1) { QuestLog_CloseTextWindow(); task->tTimer = 0; @@ -1310,11 +1192,11 @@ static void Task_EndQuestLog(u8 taskId) tState++; break; default: - if (gUnknown_203AE94.unk_0_6 == 1) + if (sQuestLogCurrentScene.sceneEndMode == 1) ShowMapNamePopup(TRUE); CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400); Free(gUnknown_203AE90); - gUnknown_203AE94 = (struct UnkStruct_203AE94){}; + sQuestLogCurrentScene = (struct UnkStruct_203AE94){}; sub_80696C0(); ScriptContext2_Disable(); gTextFlags.autoScroll = FALSE; @@ -1359,7 +1241,7 @@ static void sub_811229C(void) Free(buffer); } -void sub_811231C(void) +void FinishRecordingQuestLogScene(void) { if (gQuestLogState == QL_STATE_RECORDING) { @@ -1373,7 +1255,7 @@ void sub_811231C(void) } } -void QuestLog_OnInteractionWithSpecialNpc(void) +void QuestLog_CutRecording(void) { if (gQuestLogPlaybackState != 0 && gQuestLogState == QL_STATE_RECORDING) { @@ -1414,7 +1296,7 @@ void SaveQuestLogData(void) { if (MenuHelpers_LinkSomething() != TRUE) { - QuestLog_OnInteractionWithSpecialNpc(); + QuestLog_CutRecording(); SortQuestLogInSav1(); } } @@ -1824,2547 +1706,3 @@ void sub_8112E3C(u8 a0, struct UnkStruct_300201C * a1, u16 a2) } } } - - -// Probable file boundary, help_message.c below, quest_log.c above - - -const u16 gUnknown_84566A8[] = INCBIN_U16("data/graphics/unknown_84566a8.bin"); - -static const struct WindowTemplate sHelpMessageWindowTemplate = { - 0x00, 0, 15, 30, 5, 15, 0x008F -}; - -void MapNamePopupWindowIdSetDummy(void) -{ - sHelpMessageWindowId = 0xFF; -} - -u8 CreateHelpMessageWindow(void) -{ - if (sHelpMessageWindowId == 0xFF) - { - sHelpMessageWindowId = AddWindow(&sHelpMessageWindowTemplate); - PutWindowTilemap(sHelpMessageWindowId); - } - return sHelpMessageWindowId; -} - -void DestroyHelpMessageWindow(u8 a0) -{ - if (sHelpMessageWindowId != 0xFF) - { - FillWindowPixelBuffer(sHelpMessageWindowId, PIXEL_FILL(0)); - ClearWindowTilemap(sHelpMessageWindowId); - - if (a0) - CopyWindowToVram(sHelpMessageWindowId, a0); - - RemoveWindow(sHelpMessageWindowId); - sHelpMessageWindowId = 0xFF; - } -} - -#ifdef NONMATCHING -void sub_8112F18(u8 windowId) -{ - u8 width = GetWindowAttribute(windowId, WINDOW_WIDTH); - u8 height = GetWindowAttribute(windowId, WINDOW_HEIGHT); - u8 *buffer = Alloc(32 * width * height); - u8 i, j; - u8 k; - - if (buffer != NULL) - { - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - if (i == 0) - k = 0; - else if (i == height - 1) - k = 14; - else - k = 5; - CpuCopy32( - (void *)gUnknown_84566A8 + 32 * k, // operand swap on "add" instruction - buffer + 32 * (i * width + j), - 32 - ); - } - } - CopyToWindowPixelBuffer(windowId, buffer, width * height * 32, 0); - Free(buffer); - } -} -#else -NAKED -void sub_8112F18(u8 windowId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tmovs r1, 0x3\n" - "\tbl GetWindowAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmov r0, r10\n" - "\tmovs r1, 0x4\n" - "\tbl GetWindowAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tlsls r0, r7, 5\n" - "\tmuls r0, r6\n" - "\tbl Alloc\n" - "\tmov r8, r0\n" - "\tcmp r0, 0\n" - "\tbeq _08112FB8\n" - "\tmovs r5, 0\n" - "\tadds r0, r6, 0\n" - "\tmuls r0, r7\n" - "\tstr r0, [sp]\n" - "\tcmp r5, r7\n" - "\tbcs _08112FA2\n" - "_08112F5A:\n" - "\tmovs r4, 0\n" - "\tadds r1, r5, 0x1\n" - "\tmov r9, r1\n" - "\tcmp r4, r6\n" - "\tbcs _08112F98\n" - "\tsubs r3, r7, 0x1\n" - "_08112F66:\n" - "\tmovs r0, 0\n" - "\tcmp r5, 0\n" - "\tbeq _08112F74\n" - "\tmovs r0, 0x5\n" - "\tcmp r5, r3\n" - "\tbne _08112F74\n" - "\tmovs r0, 0xE\n" - "_08112F74:\n" - "\tlsls r0, 5\n" - "\tldr r1, _08112FC8 @ =gUnknown_84566A8\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r5, 0\n" - "\tmuls r1, r6\n" - "\tadds r1, r4\n" - "\tlsls r1, 5\n" - "\tadd r1, r8\n" - "\tldr r2, _08112FCC @ =0x04000008\n" - "\tstr r3, [sp, 0x4]\n" - "\tbl CpuSet\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tcmp r4, r6\n" - "\tbcc _08112F66\n" - "_08112F98:\n" - "\tmov r1, r9\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, r7\n" - "\tbcc _08112F5A\n" - "_08112FA2:\n" - "\tldr r0, [sp]\n" - "\tlsls r2, r0, 21\n" - "\tlsrs r2, 16\n" - "\tmov r0, r10\n" - "\tmov r1, r8\n" - "\tmovs r3, 0\n" - "\tbl CopyToWindowPixelBuffer\n" - "\tmov r0, r8\n" - "\tbl Free\n" - "_08112FB8:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08112FC8: .4byte gUnknown_84566A8\n" - "_08112FCC: .4byte 0x04000008"); -} -#endif - -static void sub_8112FD0(void) -{ - sub_8112F18(sHelpMessageWindowId); -} - -static const u8 sHelpMessageTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_DARK_GREY}; - -static void PrintHelpMessageText(const u8 *text) -{ - AddTextPrinterParameterized4(sHelpMessageWindowId, 2, 2, 5, 1, 1, sHelpMessageTextColors, -1, text); -} - -void PrintTextOnHelpMessageWindow(const u8 *text, u8 mode) -{ - sub_8112FD0(); - PrintHelpMessageText(text); - if (mode) - CopyWindowToVram(sHelpMessageWindowId, mode); -} - - -// Probable file boundary, trainer_fan_club.c below, help_message.c above - - -void ResetTrainerFanClub(void) -{ - VarSet(VAR_FANCLUB_FAN_COUNTER, 0); - VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, 0); -} - -void Script_TryLoseFansFromPlayTimeAfterLinkBattle(void) -{ - TryLoseFansFromPlayTimeAfterLinkBattle(TRAINER_FAN_CLUB); -} - -static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *fanClub) -{ - if (DidPlayerGetFirstFans(fanClub)) - { - TryLoseFansFromPlayTime(fanClub); - VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); - } -} - -void Script_UpdateTrainerFanClubGameClear(void) -{ - UpdateTrainerFanClubGameClear(TRAINER_FAN_CLUB); -} - -static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *fanClub) -{ - if (!fanClub->gotInitialFans) - { - SetPlayerGotFirstFans(fanClub); - SetInitialFansOfPlayer(fanClub); - VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); - FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT); - FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER); - FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN); - FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY); - VarSet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1); - } -} - -ALIGNED(4) const u8 sCounterIncrements[] = {2, 1, 2, 1}; - -static u8 TryGainNewFanFromCounter(struct TrainerFanClub *fanClub, u8 a1) -{ - if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) - { - if (fanClub->timer + sCounterIncrements[a1] >= 20) - { - if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 3) - { - PlayerGainRandomTrainerFan(fanClub); - fanClub->timer = 0; - } - else - fanClub->timer = 20; - } - else - fanClub->timer += sCounterIncrements[a1]; - } - - return fanClub->timer; -} - - -static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *fanClub) -{ - static const u8 sFanClubMemberIds[] = - { - FANCLUB_MEMBER2, - FANCLUB_MEMBER4, - FANCLUB_MEMBER6, - FANCLUB_MEMBER1, - FANCLUB_MEMBER8, - FANCLUB_MEMBER7, - FANCLUB_MEMBER5, - FANCLUB_MEMBER3 - }; - - u8 i; - u8 idx = 0; - - for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) - { - if (!(GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]))) - { - idx = i; - if (Random() % 2) - { - SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); - return sFanClubMemberIds[i]; - } - } - } - - SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); - return sFanClubMemberIds[idx]; -} - -static u8 PlayerLoseRandomTrainerFan(struct TrainerFanClub *fanClub) -{ - static const u8 sFanClubMemberIds[] = - { - FANCLUB_MEMBER6, - FANCLUB_MEMBER7, - FANCLUB_MEMBER4, - FANCLUB_MEMBER8, - FANCLUB_MEMBER5, - FANCLUB_MEMBER2, - FANCLUB_MEMBER1, - FANCLUB_MEMBER3 - }; - - u8 i; - u8 idx = 0; - - if (GetNumFansOfPlayerInTrainerFanClub(fanClub) == 1) - return 0; - - for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) - { - if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i])) - { - idx = i; - if (Random() % 2) - { - FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); - return sFanClubMemberIds[i]; - } - } - } - - if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx])) - FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); - - return sFanClubMemberIds[idx]; -} - -u16 Script_GetNumFansOfPlayerInTrainerFanClub(void) -{ - return GetNumFansOfPlayerInTrainerFanClub(TRAINER_FAN_CLUB); -} - -static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *fanClub) -{ - u8 count = 0; - u8 i; - - for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) - { - if (GET_TRAINER_FAN_CLUB_FLAG(i)) - count++; - } - - return count; -} - -void Script_TryLoseFansFromPlayTime(void) -{ - TryLoseFansFromPlayTime(TRAINER_FAN_CLUB); -} - -static void TryLoseFansFromPlayTime(struct TrainerFanClub *fanClub) -{ - u8 i = 0; - u16 timer; - - if (gSaveBlock2Ptr->playTimeHours < 999) - { - while (1) - { - if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 5) - { - VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); - break; - } - if (i == NUM_TRAINER_FAN_CLUB_MEMBERS) - break; - - timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); - if (gSaveBlock2Ptr->playTimeHours - timer < 12) - break; - - PlayerLoseRandomTrainerFan(fanClub); - timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); - VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, timer + 12); - i++; - } - } -} - -bool16 Script_IsFanClubMemberFanOfPlayer(void) -{ - return IsFanClubMemberFanOfPlayer(TRAINER_FAN_CLUB); -} - -static bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *fanClub) -{ - return GET_TRAINER_FAN_CLUB_FLAG(gSpecialVar_0x8004); -} - -static void SetInitialFansOfPlayer(struct TrainerFanClub *fanClub) -{ - SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER1); - SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER2); - SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER3); -} - -void Script_BufferFanClubTrainerName(void) -{ - u8 whichLinkTrainer = 0; - u8 whichNPCTrainer = 0; - - switch (gSpecialVar_0x8004) - { - case FANCLUB_MEMBER1: - whichNPCTrainer = 0; - whichLinkTrainer = 0; - break; - case FANCLUB_MEMBER2: - case FANCLUB_MEMBER3: - case FANCLUB_MEMBER4: - case FANCLUB_MEMBER8: - break; - case FANCLUB_MEMBER5: - whichNPCTrainer = 1; - whichLinkTrainer = 0; - break; - case FANCLUB_MEMBER6: - whichNPCTrainer = 0; - whichLinkTrainer = 1; - break; - case FANCLUB_MEMBER7: - whichNPCTrainer = 2; - whichLinkTrainer = 1; - break; - } - BufferFanClubTrainerName(&gSaveBlock2Ptr->linkBattleRecords, whichLinkTrainer, whichNPCTrainer); -} - -static void BufferFanClubTrainerName(struct LinkBattleRecords *linkRecords, u8 whichLinkTrainer, u8 whichNPCTrainer) -{ - u8 *str; - const u8 *linkTrainerName = linkRecords->entries[whichLinkTrainer].name; - if (linkTrainerName[0] == EOS) - { - switch (whichNPCTrainer) - { - case 0: - StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); - break; - case 1: - StringCopy(gStringVar1, gText_LtSurge); - break; - case 2: - StringCopy(gStringVar1, gText_Koga); - break; - default: - StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); - break; - } - } - else - { - str = gStringVar1; - StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH); - str[PLAYER_NAME_LENGTH] = EOS; - if ( str[0] == EXT_CTRL_CODE_BEGIN - && str[1] == EXT_CTRL_CODE_JPN) - { - str += 2; - while (*str != EOS) - str++; - *str++ = EXT_CTRL_CODE_BEGIN; - *str++ = EXT_CTRL_CODE_ENG; - *str++ = EOS; - } - } -} - -void Special_UpdateTrainerFansAfterLinkBattle(void) -{ - UpdateTrainerFansAfterLinkBattle(TRAINER_FAN_CLUB); -} - -static void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *fanClub) -{ - if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) - { - TryLoseFansFromPlayTimeAfterLinkBattle(fanClub); - if (gBattleOutcome == B_OUTCOME_WON) - PlayerGainRandomTrainerFan(fanClub); - else - PlayerLoseRandomTrainerFan(fanClub); - } -} - -static bool8 DidPlayerGetFirstFans(struct TrainerFanClub *fanClub) -{ - return fanClub->gotInitialFans; -} - -void Script_SetPlayerGotFirstFans(void) -{ - SetPlayerGotFirstFans(TRAINER_FAN_CLUB); -} - -static void SetPlayerGotFirstFans(struct TrainerFanClub *fanClub) -{ - fanClub->gotInitialFans = TRUE; -} - -u8 Script_TryGainNewFanFromCounter(void) -{ - return TryGainNewFanFromCounter(TRAINER_FAN_CLUB, gSpecialVar_0x8004); -} - - -// Probable file boundary, quest_log_events.c below, trainer_fan_club.c above - - -static u16 *(*const sQuestLogStorageCBs[])(u16 *, const u16 *) = { - [QL_EVENT_0] = NULL, - [QL_EVENT_1] = NULL, - [QL_EVENT_2] = NULL, - [QL_EVENT_SWITCHED_PARTY_ORDER] = BufferQuestLogData_SwitchedPartyOrder, - [QL_EVENT_USED_ITEM] = BufferQuestLogData_UsedItem, - [QL_EVENT_GAVE_HELD_ITEM] = BufferQuestLogData_GaveHeldItemFromPartyMenu, - [QL_EVENT_GAVE_HELD_ITEM_BAG] = BufferQuestLogData_GaveHeldItemFromBagMenu, - [QL_EVENT_GAVE_HELD_ITEM_PC] = BufferQuestLogData_GaveHeldItemFromPC, - [QL_EVENT_TOOK_HELD_ITEM] = BufferQuestLogData_TookHeldItem, - [QL_EVENT_SWAPPED_HELD_ITEM] = BufferQuestLogData_SwappedHeldItem, - [QL_EVENT_SWAPPED_HELD_ITEM_PC] = BufferQuestLogData_SwappedHeldItemFromPC, - [QL_EVENT_USED_PKMN_CENTER] = BufferQuestLogData_UsedPkmnCenter, - [QL_EVENT_LINK_TRADED] = BufferQuestLogData_LinkTraded, - [QL_EVENT_LINK_BATTLED_SINGLE] = BufferQuestLogData_LinkBattledSingle, - [QL_EVENT_LINK_BATTLED_DOUBLE] = BufferQuestLogData_LinkBattledDouble, - [QL_EVENT_LINK_BATTLED_MULTI] = BufferQuestLogData_LinkBattledMulti, - [QL_EVENT_USED_UNION_ROOM] = BufferQuestLogData_UsedUnionRoom, - [QL_EVENT_USED_UNION_ROOM_CHAT] = BufferQuestLogData_UsedUnionRoomChat, - [QL_EVENT_LINK_TRADED_UNION] = BufferQuestLogData_LinkTradedUnionRoom, - [QL_EVENT_LINK_BATTLED_UNION] = BufferQuestLogData_LinkBattledUnionRoom, - [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = BufferQuestLogData_SwitchedMonsBetweenBoxes, - [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = BufferQuestLogData_SwitchedMonsWithinBox, - [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = BufferQuestLogData_SwitchedPartyMonForPCMon, - [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = BufferQuestLogData_MovedMonBetweenBoxes, - [QL_EVENT_MOVED_MON_WITHIN_BOX] = BufferQuestLogData_MovedMonWithinBox, - [QL_EVENT_WITHDREW_MON_PC] = BufferQuestLogData_WithdrewMonFromPC, - [QL_EVENT_DEPOSITED_MON_PC] = BufferQuestLogData_DepositedMonInPC, - [QL_EVENT_SWITCHED_MULTIPLE_MONS] = BufferQuestLogData_SwitchedMultipleMons, - [QL_EVENT_DEPOSITED_ITEM_PC] = BufferQuestLogData_DepositedItemInPC, - [QL_EVENT_WITHDREW_ITEM_PC] = BufferQuestLogData_WithdrewItemFromPC, - [QL_EVENT_DEFEATED_GYM_LEADER] = BufferQuestLogData_DefeatedGymLeader, - [QL_EVENT_DEFEATED_WILD_MON] = BufferQuestLogData_DefeatedWildMon, - [QL_EVENT_DEFEATED_E4_MEMBER] = BufferQuestLogData_DefeatedEliteFourMember, - [QL_EVENT_DEFEATED_CHAMPION] = BufferQuestLogData_DefeatedChampion, - [QL_EVENT_DEFEATED_TRAINER] = BufferQuestLogData_DefeatedTrainer, - [QL_EVENT_DEPARTED] = BufferQuestLogData_DepartedLocation, - [QL_EVENT_USED_FIELD_MOVE] = BufferQuestLogData_UsedFieldMove, - [QL_EVENT_BOUGHT_ITEM] = BufferQuestLogData_BoughtItem, - [QL_EVENT_SOLD_ITEM] = BufferQuestLogData_SoldItem, - [QL_EVENT_39] = NULL, - [QL_EVENT_OBTAINED_ITEM] = BufferQuestLogData_ObtainedItem, - [QL_EVENT_41] = NULL, - [QL_EVENT_ARRIVED] = BufferQuestLogData_ArrivedInLocation -}; - -void SetQuestLogEvent(u16 eventId, const u16 *eventData) -{ - u16 *r1; - - if (eventId == QL_EVENT_DEPARTED && gUnknown_203B048 == 2) - { - sub_811381C(); - return; - } - sub_811381C(); - if (gQuestLogState == QL_STATE_PLAYBACK) - return; - - if (!IS_VALID_QL_EVENT(eventId)) - return; - - if (InQuestLogDisabledLocation() == TRUE) - return; - - if (TrySetLinkQuestLogEvent(eventId, eventData) == TRUE) - return; - - if (MenuHelpers_LinkSomething() == TRUE) - return; - - if (InUnionRoom() == TRUE) - return; - - if (TrySetTrainerBattleQuestLogEvent(eventId, eventData) == TRUE) - return; - - if (IsQuestLogEventWithSpecialEncounterSpecies(eventId, eventData) == TRUE) - return; - - if (sub_81153E4(eventId, eventData) == FALSE) - return; - - if (gQuestLogPlaybackState == 0) - { - if (sub_8113778(eventId, eventData) == TRUE) - return; - - if (eventId != QL_EVENT_DEFEATED_WILD_MON || gUnknown_203AE04 == NULL) - { - if (sub_81153A8(eventId, eventData) == FALSE) - return; - StartRecordingQuestLogEntry(eventId); - } - } - else if (eventId == QL_EVENT_OBTAINED_ITEM) - return; - - sub_8113B94(eventId); - if (eventId == QL_EVENT_DEFEATED_WILD_MON) - { - if (gUnknown_203AE04 == NULL) - { - gUnknown_203AE04 = sEventRecordingPointer; - r1 = sQuestLogStorageCBs[eventId](gUnknown_203AE04, eventData); - } - else - { - sQuestLogStorageCBs[eventId](gUnknown_203AE04, eventData); - return; - } - } - else - { - gUnknown_203AE04 = NULL; - r1 = sQuestLogStorageCBs[eventId](sEventRecordingPointer, eventData); - } - - if (r1 == NULL) - { - sub_811231C(); - r1 = sub_8113828(eventId, eventData); - if (r1 == NULL) - return; - } - - sEventRecordingPointer = r1; - if (gUnknown_203B048 == 0) - return; - sub_811231C(); -} - -static bool8 InQuestLogDisabledLocation(void) -{ - // In Trainer Tower - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F) - && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))) - return TRUE; - - // In pokemon trainer fan club - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB)) - return TRUE; - - // In E-Reader house - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM1) && - (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM1) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2))) - return TRUE; - - // In elevator - if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR)) - || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR)) - || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)) - || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR))) - return TRUE; - - return FALSE; -} - -bool8 sub_8113748(void) -{ - if (InQuestLogDisabledLocation() != TRUE) - return FALSE; - - if (gQuestLogState == QL_STATE_PLAYBACK) - return TRUE; - - if (gQuestLogState == QL_STATE_RECORDING) - QuestLog_OnInteractionWithSpecialNpc(); - - return FALSE; -} - -static bool8 sub_8113778(u16 eventId, const u16 *eventData) -{ - if (eventId == QL_EVENT_USED_FIELD_MOVE || eventId == QL_EVENT_USED_PKMN_CENTER) - return TRUE; - - if (!FlagGet(FLAG_SYS_GAME_CLEAR)) - { - if (eventId == QL_EVENT_SWITCHED_PARTY_ORDER || eventId == QL_EVENT_DEFEATED_WILD_MON || sub_81137E4(eventId, eventData) == TRUE) - return TRUE; - } - - if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) - { - if (eventId == QL_EVENT_USED_ITEM - || eventId == QL_EVENT_GAVE_HELD_ITEM - || eventId == QL_EVENT_GAVE_HELD_ITEM_BAG - || eventId == QL_EVENT_GAVE_HELD_ITEM_PC - || eventId == QL_EVENT_TOOK_HELD_ITEM - || eventId == QL_EVENT_SWAPPED_HELD_ITEM - || eventId == QL_EVENT_SWAPPED_HELD_ITEM_PC - || eventId == QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON - || eventId == QL_EVENT_WITHDREW_MON_PC - || eventId == QL_EVENT_DEPOSITED_MON_PC) - return TRUE; - } - - return FALSE; -} - -static bool8 sub_81137E4(u16 eventId, const u16 *eventData) -{ - if (eventId == QL_EVENT_DEFEATED_TRAINER) - { - u8 trainerClass = gTrainers[*eventData].trainerClass; - if ( trainerClass == CLASS_RIVAL - || trainerClass == CLASS_RIVAL_2 - || trainerClass == CLASS_CHAMPION_2 - || trainerClass == CLASS_BOSS) - return FALSE; - return TRUE; - } - return FALSE; -} - -static void sub_811381C(void) -{ - gUnknown_203B048 = 0; -} - -static u16 *sub_8113828(u16 eventId, const u16 *eventData) -{ - if (sub_8113778(eventId, eventData) == TRUE) - return NULL; - - if (sub_81153A8(eventId, eventData) == FALSE) - return NULL; - - StartRecordingQuestLogEntry(eventId); - sub_8113B94(eventId); - - if (eventId == QL_EVENT_DEFEATED_WILD_MON) - gUnknown_203AE04 = sEventRecordingPointer; - else - gUnknown_203AE04 = NULL; - - return sQuestLogStorageCBs[eventId](sEventRecordingPointer, eventData); -} - -static bool8 TrySetLinkQuestLogEvent(u16 eventId, const u16 *eventData) -{ - if (!IS_LINK_QL_EVENT(eventId)) - return FALSE; - - sub_81138F8(); - gUnknown_203B024.unk_00 = eventId; - - if (eventId != QL_EVENT_USED_UNION_ROOM && eventId != QL_EVENT_USED_UNION_ROOM_CHAT) - { - if (eventId == QL_EVENT_LINK_TRADED || eventId == QL_EVENT_LINK_TRADED_UNION) - memcpy(gUnknown_203B024.unk_04, eventData, 12); - else - memcpy(gUnknown_203B024.unk_04, eventData, 24); - } - return TRUE; -} - -void sub_81138F8(void) -{ - gUnknown_203B024 = (struct UnkStruct_203B024){}; -} - -void QuestLog_StartRecordingInputsAfterDeferredEvent(void) -{ - if (gUnknown_203B024.unk_00 != QL_EVENT_0) - { - u16 *resp; - gUnknown_203B04A = 0; - StartRecordingQuestLogEntry(gUnknown_203B024.unk_00); - resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](sEventRecordingPointer, gUnknown_203B024.unk_04); - sEventRecordingPointer = resp; - sub_81138F8(); - } -} - -static bool8 TrySetTrainerBattleQuestLogEvent(u16 eventId, const u16 *eventData) -{ - if (eventId != QL_EVENT_DEFEATED_TRAINER - && eventId != QL_EVENT_DEFEATED_GYM_LEADER - && eventId != QL_EVENT_DEFEATED_E4_MEMBER - && eventId != QL_EVENT_DEFEATED_CHAMPION) - return FALSE; - - sub_81138F8(); - if (gQuestLogPlaybackState != 0 || FlagGet(FLAG_SYS_GAME_CLEAR) || sub_81137E4(eventId, eventData) != TRUE) - { - gUnknown_203B024.unk_00 = eventId; - memcpy(gUnknown_203B024.unk_04, eventData, 8); - } - return TRUE; -} - -void sub_81139BC(void) -{ - if (gUnknown_203B024.unk_00 != QL_EVENT_0) - { - u16 *resp; - if (gQuestLogPlaybackState == 0) - { - gUnknown_203B04A = 0; - StartRecordingQuestLogEntry(gUnknown_203B024.unk_00); - } - sub_8113B94(gUnknown_203B024.unk_00); - resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](sEventRecordingPointer, gUnknown_203B024.unk_04); - sEventRecordingPointer = resp; - TryRecordEvent41_IncCursor(1); - sub_81138F8(); - sub_811231C(); - } -} - -static void TryRecordEvent41_IncCursor(u16 a0) -{ - sEventRecordingPointer = TryRecordEvent41(sEventRecordingPointer, a0); - sQuestLogCursor++; -} - -static bool8 IsQuestLogEventWithSpecialEncounterSpecies(u16 eventId, const u16 *eventData) -{ - if (eventId != QL_EVENT_DEFEATED_WILD_MON) - return FALSE; - - if (IsSpeciesFromSpecialEncounter(eventData[0]) == TRUE) - return TRUE; - - if (IsSpeciesFromSpecialEncounter(eventData[1]) == TRUE) - return TRUE; - - return FALSE; -} - -static const u16 *(*const sQuestLogEventTextBufferCBs[])(const u16 *) = { - [QL_EVENT_0] = NULL, - [QL_EVENT_1] = NULL, - [QL_EVENT_2] = NULL, - [QL_EVENT_SWITCHED_PARTY_ORDER] = BufferQuestLogText_SwitchedPartyOrder, - [QL_EVENT_USED_ITEM] = BufferQuestLogText_UsedItem, - [QL_EVENT_GAVE_HELD_ITEM] = BufferQuestLogText_GaveHeldItemFromPartyMenu, - [QL_EVENT_GAVE_HELD_ITEM_BAG] = BufferQuestLogText_GaveHeldItemFromBagMenu, - [QL_EVENT_GAVE_HELD_ITEM_PC] = BufferQuestLogText_GaveHeldItemFromPC, - [QL_EVENT_TOOK_HELD_ITEM] = BufferQuestLogText_TookHeldItem, - [QL_EVENT_SWAPPED_HELD_ITEM] = BufferQuestLogText_SwappedHeldItem, - [QL_EVENT_SWAPPED_HELD_ITEM_PC] = BufferQuestLogText_SwappedHeldItemFromPC, - [QL_EVENT_USED_PKMN_CENTER] = BufferQuestLogText_UsedPkmnCenter, - [QL_EVENT_LINK_TRADED] = BufferQuestLogText_LinkTraded, - [QL_EVENT_LINK_BATTLED_SINGLE] = BufferQuestLogText_LinkBattledSingle, - [QL_EVENT_LINK_BATTLED_DOUBLE] = BufferQuestLogText_LinkBattledDouble, - [QL_EVENT_LINK_BATTLED_MULTI] = BufferQuestLogText_LinkBattledMulti, - [QL_EVENT_USED_UNION_ROOM] = BufferQuestLogText_UsedUnionRoom, - [QL_EVENT_USED_UNION_ROOM_CHAT] = BufferQuestLogText_UsedUnionRoomChat, - [QL_EVENT_LINK_TRADED_UNION] = BufferQuestLogText_LinkTradedUnionRoom, - [QL_EVENT_LINK_BATTLED_UNION] = BufferQuestLogText_LinkBattledUnionRoom, - [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = BufferQuestLogText_SwitchedMonsBetweenBoxes, - [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = BufferQuestLogText_SwitchedMonsWithinBox, - [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = BufferQuestLogText_SwitchedPartyMonForPCMon, - [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = BufferQuestLogText_MovedMonBetweenBoxes, - [QL_EVENT_MOVED_MON_WITHIN_BOX] = BufferQuestLogText_MovedMonWithinBox, - [QL_EVENT_WITHDREW_MON_PC] = BufferQuestLogText_WithdrewMonFromPC, - [QL_EVENT_DEPOSITED_MON_PC] = BufferQuestLogText_DepositedMonInPC, - [QL_EVENT_SWITCHED_MULTIPLE_MONS] = BufferQuestLogText_SwitchedMultipleMons, - [QL_EVENT_DEPOSITED_ITEM_PC] = BufferQuestLogText_DepositedItemInPC, - [QL_EVENT_WITHDREW_ITEM_PC] = BufferQuestLogText_WithdrewItemFromPC, - [QL_EVENT_DEFEATED_GYM_LEADER] = BufferQuestLogText_DefeatedGymLeader, - [QL_EVENT_DEFEATED_WILD_MON] = BufferQuestLogText_DefeatedWildMon, - [QL_EVENT_DEFEATED_E4_MEMBER] = BufferQuestLogText_DefeatedEliteFourMember, - [QL_EVENT_DEFEATED_CHAMPION] = BufferQuestLogText_DefeatedChampion, - [QL_EVENT_DEFEATED_TRAINER] = BufferQuestLogText_DefeatedTrainer, - [QL_EVENT_DEPARTED] = BufferQuestLogText_DepartedLocation, - [QL_EVENT_USED_FIELD_MOVE] = BufferQuestLogText_UsedFieldMove, - [QL_EVENT_BOUGHT_ITEM] = BufferQuestLogText_BoughtItem, - [QL_EVENT_SOLD_ITEM] = BufferQuestLogText_SoldItem, - [QL_EVENT_39] = NULL, - [QL_EVENT_OBTAINED_ITEM] = BufferQuestLogText_ObtainedItem, - [QL_EVENT_41] = NULL, - [QL_EVENT_ARRIVED] = BufferQuestLogText_ArrivedInLocation -}; - -static const u8 sQuestLogEventCmdSizes[] = { - [QL_EVENT_0] = 0x08, - [QL_EVENT_1] = 0x08, - [QL_EVENT_2] = 0x08, - [QL_EVENT_SWITCHED_PARTY_ORDER] = 0x08, - [QL_EVENT_USED_ITEM] = 0x0a, - [QL_EVENT_GAVE_HELD_ITEM] = 0x08, - [QL_EVENT_GAVE_HELD_ITEM_BAG] = 0x08, - [QL_EVENT_GAVE_HELD_ITEM_PC] = 0x08, - [QL_EVENT_TOOK_HELD_ITEM] = 0x08, - [QL_EVENT_SWAPPED_HELD_ITEM] = 0x0a, - [QL_EVENT_SWAPPED_HELD_ITEM_PC] = 0x0a, - [QL_EVENT_USED_PKMN_CENTER] = 0x04, - [QL_EVENT_LINK_TRADED] = 0x10, - [QL_EVENT_LINK_BATTLED_SINGLE] = 0x0c, - [QL_EVENT_LINK_BATTLED_DOUBLE] = 0x0c, - [QL_EVENT_LINK_BATTLED_MULTI] = 0x1a, - [QL_EVENT_USED_UNION_ROOM] = 0x04, - [QL_EVENT_USED_UNION_ROOM_CHAT] = 0x04, - [QL_EVENT_LINK_TRADED_UNION] = 0x10, - [QL_EVENT_LINK_BATTLED_UNION] = 0x0c, - [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = 0x0a, - [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = 0x0a, - [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = 0x0a, - [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = 0x08, - [QL_EVENT_MOVED_MON_WITHIN_BOX] = 0x08, - [QL_EVENT_WITHDREW_MON_PC] = 0x08, - [QL_EVENT_DEPOSITED_MON_PC] = 0x08, - [QL_EVENT_SWITCHED_MULTIPLE_MONS] = 0x06, - [QL_EVENT_DEPOSITED_ITEM_PC] = 0x06, - [QL_EVENT_WITHDREW_ITEM_PC] = 0x06, - [QL_EVENT_DEFEATED_GYM_LEADER] = 0x0c, - [QL_EVENT_DEFEATED_WILD_MON] = 0x0c, - [QL_EVENT_DEFEATED_E4_MEMBER] = 0x0c, - [QL_EVENT_DEFEATED_CHAMPION] = 0x0a, - [QL_EVENT_DEFEATED_TRAINER] = 0x0c, - [QL_EVENT_DEPARTED] = 0x06, - [QL_EVENT_USED_FIELD_MOVE] = 0x08, - [QL_EVENT_BOUGHT_ITEM] = 0x0e, - [QL_EVENT_SOLD_ITEM] = 0x0e, - [QL_EVENT_39] = 0x02, - [QL_EVENT_OBTAINED_ITEM] = 0x08, - [QL_EVENT_41] = 0x04, - [QL_EVENT_ARRIVED] = 0x06 -}; - -static u16 *QuestLog_SkipCommand(u16 *curPtr, u16 **prevPtr_p) -{ - u16 eventId = curPtr[0] & 0xfff; - u16 cnt = curPtr[0] >> 12; - - if (eventId == QL_EVENT_DEFEATED_CHAMPION) - cnt = 0; - - if (!IS_VALID_QL_EVENT(eventId)) - return NULL; - - *prevPtr_p = curPtr; - return sQuestLogEventCmdSizes[eventId] + (sQuestLogEventCmdSizes[eventId] - 4) * cnt + (void *)curPtr; -} - -static void sub_8113ABC(const u16 *a0) -{ - const u8 *r2 = (const u8 *)(a0 + 2); - if ((a0[0] & 0xFFF) != QL_EVENT_DEPARTED) - gUnknown_203B04A = 0; - else - gUnknown_203B04A = r2[1] + 1; -} - -static bool8 sub_8113AE8(const u16 *a0) -{ -#ifndef NONMATCHING - register const u16 *r0 asm("r0") = a0; -#else - const u16 *r0 = a0; -#endif - - if (r0 == NULL || r0[1] > sQuestLogCursor) - return FALSE; - - sQuestLogEventTextBufferCBs[a0[0] & 0xFFF](a0); - gUnknown_203B044.unk_0 = a0[0]; - gUnknown_203B044.unk_1 = (a0[0] & 0xF000) >> 12; - if (gUnknown_203B044.unk_1 != 0) - gUnknown_203B044.unk_2 = 1; - return TRUE; -} - -static bool8 sub_8113B44(const u16 *a0) -{ - if (gUnknown_203B044.unk_2 == 0) - return FALSE; - - sQuestLogEventTextBufferCBs[gUnknown_203B044.unk_0](a0); - gUnknown_203B044.unk_2++; - if (gUnknown_203B044.unk_2 > gUnknown_203B044.unk_1) - sub_8113B88(); - return TRUE; -} - -static void sub_8113B88(void) -{ - gUnknown_203B044 = (struct UnkStruct_203B044){}; -} - -static void sub_8113B94(u16 eventId) -{ - if (gUnknown_203B044.unk_0 != (u8)eventId || gUnknown_203B044.unk_2 != sQuestLogCursor) - { - gUnknown_203B044.unk_0 = eventId; - gUnknown_203B044.unk_1 = 0; - gUnknown_203B044.unk_2 = sQuestLogCursor; - } - else if (gUnknown_203B044.unk_1 < 5) - gUnknown_203B044.unk_1++; -} - -static void sub_8113BD8(void) -{ - sNewlyEnteredMap = FALSE; - gUnknown_203B04A = 0; - gUnknown_203B04B = FALSE; -} - -static u16 *TryRecordEvent39_NoParams(u16 *a0) -{ - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_39])) - return NULL; - a0[0] = QL_EVENT_39; - return a0 + 1; -} - -static u16 *sub_8113C20(u16 *a0, struct QuestLogEntry * a1) -{ - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_39])) - return NULL; - a1->unk_6 = 0xFF; - a1->unk_4 = 0; - a1->unk_0 = 0; - a1->unk_1 = 0; - a1->unk_2 = 0; - a1->unk_3 = 0; - return a0 + 1; -} - -static u16 *TryRecordEvent41(u16 *a0, u16 a1) -{ - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_41])) - return NULL; - a0[0] = QL_EVENT_41; - a0[1] = a1; - return a0 + 2; -} - -static u16 *sub_8113C8C(u16 *a0, struct QuestLogEntry * a1) -{ - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_41])) - return NULL; - a1->unk_6 = 0xFE; - a1->unk_4 = a0[1]; - a1->unk_0 = 0; - a1->unk_1 = 0; - a1->unk_2 = 0; - a1->unk_3 = 0; - return a0 + 2; -} - -static u16 *sub_8113CC8(u16 *a0, struct QuestLogEntry * a1) -{ - u8 *r6 = (u8 *)a0 + 4; - - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_0])) - return NULL; - a0[0] = 0; - a0[1] = a1->unk_4; - r6[0] = a1->unk_0; - r6[1] = a1->unk_1; - r6[2] = a1->unk_2; - r6[3] = a1->unk_3; - return (u16 *)(r6 + 4); -} - -static u16 *sub_8113D08(u16 *a0, struct QuestLogEntry * a1) -{ - u8 *r6 = (u8 *)a0 + 4; - - if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_0])) - return NULL; - a1->unk_6 = 2; - a1->unk_4 = a0[1]; - a1->unk_0 = r6[0]; - a1->unk_1 = r6[1]; - a1->unk_2 = r6[2]; - a1->unk_3 = r6[3]; - return (u16 *)(r6 + 4); -} - -static u16 *sub_8113D48(u16 *a0, struct QuestLogEntry * a1) -{ - u16 *r4 = a0; - u8 *r6 = (u8 *)a0 + 4; - - if (!WillCommandOfSizeFitInSav1Record(r4, sQuestLogEventCmdSizes[QL_EVENT_2])) - return NULL; - if (a1->unk_6 == 0) - r4[0] = 2; - else - r4[0] = 1; - r4[1] = a1->unk_4; - r6[0] = a1->unk_0; - r6[1] = a1->unk_1; - r6[2] = a1->unk_2; - r6[3] = a1->unk_3; - return (u16 *)(r6 + 4); -} - -static u16 *sub_8113D94(u16 *a0, struct QuestLogEntry * a1) -{ - u16 *r5 = a0; - u8 *r6 = (u8 *)a0 + 4; - - if (!WillCommandOfSizeFitInSav1Record(r5, sQuestLogEventCmdSizes[QL_EVENT_2])) - return NULL; - if (r5[0] == 2) - a1->unk_6 = 0; - else - a1->unk_6 = 1; - a1->unk_4 = r5[1]; - a1->unk_0 = r6[0]; - a1->unk_1 = r6[1]; - a1->unk_2 = r6[2]; - a1->unk_3 = r6[3]; - return (u16 *)(r6 + 4); -} - -u16 *sub_8113DE0(u16 eventId, u16 *a1) -{ - u8 cmdSize; - u16 *r5; - u8 r4; - u8 r1; - - if (gUnknown_203B044.unk_1 == 0) - cmdSize = sQuestLogEventCmdSizes[eventId]; - else - cmdSize = sQuestLogEventCmdSizes[eventId] - 4; - if (!sub_8110944(a1, cmdSize)) - return NULL; - - r5 = (void *)a1; - - if (gUnknown_203B044.unk_1 != 0) - r5 = (void *)r5 - (gUnknown_203B044.unk_1 * cmdSize + 4); - - if (gUnknown_203B044.unk_1 == 5) - { - for (r4 = 0; r4 < 4; r4++) - { - memcpy( - (void *)r5 + (r4 * cmdSize + 4), - (void *)r5 + ((r4 + 1) * cmdSize + 4), - cmdSize - ); - } - r1 = 4; - } - else - r1 = gUnknown_203B044.unk_1; - - r5[0] = eventId + (r1 << 12); - r5[1] = sQuestLogCursor; - r5 = (void *)r5 + (r1 * cmdSize + 4); - return r5; -} - -static const u16 *sub_8113E88(u16 eventId, const u16 *eventData) -{ - eventData = (const void *)eventData + (gUnknown_203B044.unk_2 * (sQuestLogEventCmdSizes[eventId] - 4) + 4); - return eventData; -} - -static void QuestLog_GetSpeciesName(u16 species, u8 *dest, u8 stringVarId) -{ - if (dest != NULL) - { - if (species != SPECIES_EGG) - GetSpeciesName(dest, species); - else - StringCopy(dest, gText_EggNickname); - } - else - { - if (species != SPECIES_EGG) - DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gSpeciesNames[species]); - else - DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gText_EggNickname); - } -} - -static u16 *BufferQuestLogData_SwitchedPartyOrder(u16 *a0, const u16 *eventData) -{ - u16 *r2 = sub_8113DE0(QL_EVENT_SWITCHED_PARTY_ORDER, a0); - if (r2 == NULL) - return NULL; - - r2[0] = eventData[0]; - r2[1] = eventData[1]; - return r2 + 2; -} - -static const u16 *BufferQuestLogText_SwitchedPartyOrder(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_SWITCHED_PARTY_ORDER, eventData); - QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); - QuestLog_GetSpeciesName(r4[1], gStringVar2, 0); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchMon1WithMon2); - r4 += 2; - return r4; -} - -static u16 *BufferQuestLogData_UsedItem(u16 *a0, const u16 *eventData) -{ - u16 *r2 = sub_8113DE0(QL_EVENT_USED_ITEM, a0); - if (r2 == NULL) - return NULL; - - r2[0] = eventData[0]; - r2[1] = eventData[2]; - r2[2] = eventData[3]; - - if (eventData[0] == ITEM_ESCAPE_ROPE) - gUnknown_203B048 = 2; - - return r2 + 3; -} - -static const u16 *BufferQuestLogText_UsedItem(const u16 *eventData) -{ - const u16 *r5 = sub_8113E88(QL_EVENT_USED_ITEM, eventData); - - switch (ItemId_GetPocket(r5[0])) - { - case POCKET_ITEMS: - case POCKET_POKE_BALLS: - case POCKET_BERRY_POUCH: - StringCopy(gStringVar1, ItemId_GetName(r5[0])); - if (r5[0] == ITEM_ESCAPE_ROPE) - { - GetMapNameGeneric(gStringVar2, (u8)r5[2]); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedEscapeRope); - } - else if (r5[1] != 0xFFFF) - { - QuestLog_GetSpeciesName(r5[1], gStringVar2, 0); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedItemOnMonAtThisLocation); - } - else - { - StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheItem); - } - break; - case POCKET_KEY_ITEMS: - StringCopy(gStringVar1, ItemId_GetName(r5[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheKeyItem); - break; - case POCKET_TM_CASE: - QuestLog_GetSpeciesName(r5[1], gStringVar1, 0); - StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(r5[0])]); - if (r5[2] != 0xFFFF) - { - StringCopy(gStringVar3, gMoveNames[r5[2]]); - if (r5[0] > ITEM_TM50) - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithHM); - else - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithTM); - } - else - { - if (r5[0] > ITEM_TM50) - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromHM); - else - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromTM); - } - break; - } - return r5 + 3; -} - -u16 *BufferQuestLogData_GiveTakeHeldItem(u16 eventId, u16 *a1, const u16 *eventData) -{ - u16 *r1 = sub_8113DE0(eventId, a1); - if (r1 == NULL) - return NULL; - - r1[0] = eventData[0]; - r1[1] = eventData[2]; - return r1 + 2; -} - -static u16 *BufferQuestLogData_GaveHeldItemFromPartyMenu(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM, a0, eventData); -} - -static const u16 *BufferQuestLogText_GaveHeldItemFromPartyMenu(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM, eventData); - QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); - StringCopy(gStringVar2, ItemId_GetName(r4[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem); - r4 += 2; - return r4; -} - -static u16 *BufferQuestLogData_GaveHeldItemFromBagMenu(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_BAG, a0, eventData); -} - -static const u16 *BufferQuestLogText_GaveHeldItemFromBagMenu(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM_BAG, eventData); - QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); - StringCopy(gStringVar2, ItemId_GetName(r4[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem2); - r4 += 2; - return r4; -} - -static u16 *BufferQuestLogData_GaveHeldItemFromPC(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_PC, a0, eventData); -} - -static const u16 *BufferQuestLogText_GaveHeldItemFromPC(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM_PC, eventData); - - QuestLog_GetSpeciesName(r4[1], gStringVar2, 0); - StringCopy(gStringVar1, ItemId_GetName(r4[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItemFromPC); - r4 += 2; - return r4; -} - -static u16 *BufferQuestLogData_TookHeldItem(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_TOOK_HELD_ITEM, a0, eventData); -} - -static const u16 *BufferQuestLogText_TookHeldItem(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_TOOK_HELD_ITEM, eventData); - - QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); - StringCopy(gStringVar2, ItemId_GetName(r4[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_TookHeldItemFromMon); - r4 += 2; - return r4; -} - -u16 *BufferQuestLogData_SwappedHeldItem_(u16 eventId, u16 *a1, const u16 *eventData) -{ - u16 *r1 = sub_8113DE0(eventId, a1); - if (r1 == NULL) - return NULL; - - r1[0] = eventData[0]; - r1[1] = eventData[1]; - r1[2] = eventData[2]; - return r1 + 3; -} - -static u16 *BufferQuestLogData_SwappedHeldItem(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_SwappedHeldItem_(QL_EVENT_SWAPPED_HELD_ITEM, a0, eventData); -} - -static const u16 *BufferQuestLogText_SwappedHeldItem(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_SWAPPED_HELD_ITEM, eventData); - QuestLog_GetSpeciesName(r4[2], gStringVar1, 0); - StringCopy(gStringVar2, ItemId_GetName(r4[0])); // Item taken - StringCopy(gStringVar3, ItemId_GetName(r4[1])); // Item given - StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemsOnMon); - r4 += 3; - return r4; -} - -static u16 *BufferQuestLogData_SwappedHeldItemFromPC(u16 *a0, const u16 *eventData) -{ - return BufferQuestLogData_SwappedHeldItem_(QL_EVENT_SWAPPED_HELD_ITEM_PC, a0, eventData); -} - -static const u16 *BufferQuestLogText_SwappedHeldItemFromPC(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_SWAPPED_HELD_ITEM_PC, eventData); - QuestLog_GetSpeciesName(r4[2], gStringVar2, 0); - StringCopy(gStringVar3, ItemId_GetName(r4[0])); - StringCopy(gStringVar1, ItemId_GetName(r4[1])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemFromPC); - r4 += 3; - return r4; -} - -static u16 *BufferQuestLogData_UsedPkmnCenter(u16 *a0, const u16 *eventData) -{ - u16 *r4 = a0; - if (gUnknown_203B044.unk_0 == QL_EVENT_USED_PKMN_CENTER && gUnknown_203B044.unk_1 != 0) - return r4; - - if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_USED_PKMN_CENTER])) - return NULL; - - r4[0] = QL_EVENT_USED_PKMN_CENTER; - r4[1] = sQuestLogCursor; - return r4 + 2; -} - -static const u16 *BufferQuestLogText_UsedPkmnCenter(const u16 *a0) -{ - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonsWereFullyRestoredAtCenter); - a0 += 2; - return a0; -} - -static u16 *BufferQuestLogData_LinkTraded(u16 *a0, const u16 *eventData) -{ - u16 *r4 = a0 + 4; - - a0[0] = QL_EVENT_LINK_TRADED; - a0[1] = sQuestLogCursor; - a0[2] = eventData[0]; - a0[3] = eventData[1]; - eventData += 2; - memcpy(r4, eventData, 7); - r4 += 4; - return r4; -} - -static const u16 *BufferQuestLogText_LinkTraded(const u16 *a0) -{ - const u16 *r6 = a0 + 4; - - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH); - - BufferLinkPartnersName(gStringVar1); - QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); // Mon received - QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); // Mon sent - StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForPersonsMon2); - r6 += 4; - return r6; -} - -static const u8 *const sDefeatedOpponentFlavorTexts[] = { - gText_QuestLog_Handily, - gText_QuestLog_Tenaciously, - gText_QuestLog_Somehow -}; - -static const u8 *const sDefeatedChampionFlavorTexts[] = { - gText_QuestLog_Coolly, - gText_QuestLog_Somehow, - gText_QuestLog_Barely -}; - -static const u8 *const sBattleOutcomeTexts[] = { - gText_QuestLog_Win, - gText_QuestLog_Loss, - gText_QuestLog_Draw -}; - -static u16 *BufferQuestLogData_LinkBattledSingle(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_LINK_BATTLED_SINGLE; - a0[1] = sQuestLogCursor; - *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); - memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); - a0 += 6; - return a0; -} - -static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *a0) -{ - DynamicPlaceholderTextUtil_Reset(); - - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); - BufferLinkPartnersName(gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SingleBattleWithPersonResultedInOutcome); - a0 += 6; - return a0; -} - -static u16 *BufferQuestLogData_LinkBattledDouble(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_LINK_BATTLED_DOUBLE; - a0[1] = sQuestLogCursor; - *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); - memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); - a0 += 6; - return a0; -} - -static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *a0) -{ - DynamicPlaceholderTextUtil_Reset(); - - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); - BufferLinkPartnersName(gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DoubleBattleWithPersonResultedInOutcome); - a0 += 6; - return a0; -} - -static u16 *BufferQuestLogData_LinkBattledMulti(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_LINK_BATTLED_MULTI; - a0[1] = sQuestLogCursor; - *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); - memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); - memcpy((u8 *)a0 + 12, (const u8 *)eventData + 8, PLAYER_NAME_LENGTH); - memcpy((u8 *)a0 + 19, (const u8 *)eventData + 15, PLAYER_NAME_LENGTH); - a0 += 13; - return a0; -} - -static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *a0) -{ - DynamicPlaceholderTextUtil_Reset(); - - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memset(gStringVar2, EOS, PLAYER_NAME_LENGTH + 1); - memset(gStringVar3, EOS, PLAYER_NAME_LENGTH + 1); - StringCopy7(gStringVar1, (const u8 *)a0 + 5); - StringCopy7(gStringVar2, (const u8 *)a0 + 12); - StringCopy7(gStringVar3, (const u8 *)a0 + 19); - BufferLinkPartnersName(gStringVar1); - BufferLinkPartnersName(gStringVar2); - BufferLinkPartnersName(gStringVar3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); // partner - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); // opponent 1 - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); // opponent 2 - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sBattleOutcomeTexts[((const u8 *)a0)[4]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MultiBattleWithPeopleResultedInOutcome); - a0 += 13; - return a0; -} - -static u16 *BufferQuestLogData_UsedUnionRoom(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_USED_UNION_ROOM; - a0[1] = sQuestLogCursor; - return a0 + 2; -} - -static const u16 *BufferQuestLogText_UsedUnionRoom(const u16 *a0) -{ - StringExpandPlaceholders(gStringVar4, gText_QuestLog_MingledInUnionRoom); - a0 += 2; - return a0; -} - -static u16 *BufferQuestLogData_UsedUnionRoomChat(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_USED_UNION_ROOM_CHAT; - a0[1] = sQuestLogCursor; - return a0 + 2; -} - -static const u16 *BufferQuestLogText_UsedUnionRoomChat(const u16 *a0) -{ - StringExpandPlaceholders(gStringVar4, gText_QuestLog_ChattedWithManyTrainers); - a0 += 2; - return a0; -} - -static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *a0, const u16 *eventData) -{ - u8 *r4 = (u8 *)(a0 + 4); - a0[0] = QL_EVENT_LINK_TRADED_UNION; - a0[1] = sQuestLogCursor; - a0[2] = eventData[0]; - a0[3] = eventData[1]; - memcpy(r4, eventData + 2, PLAYER_NAME_LENGTH); - r4 += 8; - return (u16 *)r4; -} - -static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *a0) -{ - const u8 *r6 = (const u8 *)(a0 + 4); - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH); - BufferLinkPartnersName(gStringVar1); - QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); - QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForTrainersMon2); - r6 += 8; - return (const u16 *)r6; -} - -static u16 *BufferQuestLogData_LinkBattledUnionRoom(u16 *a0, const u16 *eventData) -{ - a0[0] = QL_EVENT_LINK_BATTLED_UNION; - a0[1] = sQuestLogCursor; - *(u8 *)&a0[2] = *(const u8 *)&eventData[0]; - memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); - a0 += 6; - return a0; -} - -static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *a0) -{ - memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); - memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); - BufferLinkPartnersName(gStringVar1); - StringCopy(gStringVar2, sBattleOutcomeTexts[*(const u8 *)&a0[2]]); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_BattledTrainerEndedInOutcome); - a0 += 6; - return a0; -} - -static u16 *BufferQuestLogData_SwitchedMonsBetweenBoxes(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - a0[1] = eventData[1]; - *((u8 *)a0 + 4) = *((const u8 *)eventData + 4); - *((u8 *)a0 + 5) = *((const u8 *)eventData + 5); - return a0 + 3; -} - -static const u16 *BufferQuestLogText_SwitchedMonsBetweenBoxes(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, eventData); - boxIdxs = (const u8 *)eventData + 4; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); - QuestLog_GetSpeciesName(eventData[1], NULL, 3); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsBetweenBoxes); - return eventData + 3; -} - -static u16 *BufferQuestLogData_SwitchedMonsWithinBox(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - a0[1] = eventData[1]; - *((u8 *)a0 + 4) = *((const u8 *)eventData + 4); - return a0 + 3; -} - -static const u16 *BufferQuestLogText_SwitchedMonsWithinBox(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, eventData); - boxIdxs = (const u8 *)eventData + 4; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - QuestLog_GetSpeciesName(eventData[1], NULL, 2); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsWithinBox); - return eventData + 3; -} - -static u16 *BufferQuestLogData_SwitchedPartyMonForPCMon(u16 *a0, const u16 *eventData) -{ - u16 *r2; - u16 *ret; - r2 = sub_8113DE0(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, a0); - if (r2 == NULL) - return NULL; - ret = r2 + 2; - if (*((const u8 *)eventData + 4) == TOTAL_BOXES_COUNT) - { - r2[0] = eventData[1]; - r2[1] = eventData[0]; - *((u8 *)r2 + 4) = *((const u8 *)eventData + 5); - } - else - { - r2[0] = eventData[0]; - r2[1] = eventData[1]; - *((u8 *)r2 + 4) = *((const u8 *)eventData + 4); - } - return ret + 1; -} - -static const u16 *BufferQuestLogText_SwitchedPartyMonForPCMon(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, eventData); - boxIdxs = (const u8 *)eventData + 4; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - QuestLog_GetSpeciesName(eventData[1], NULL, 2); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedPartyMonForPCMon); - return eventData + 3; -} - -static u16 *BufferQuestLogData_MovedMonBetweenBoxes(u16 *a0, const u16 *eventData) -{ - u16 *r2; - u16 *ret; - r2 = sub_8113DE0(QL_EVENT_MOVED_MON_BETWEEN_BOXES, a0); - if (r2 == NULL) - return NULL; - r2[0] = eventData[0]; - ret = r2 + 1; - *((u8 *)ret + 0) = *((const u8 *)eventData + 4); - *((u8 *)ret + 1) = *((const u8 *)eventData + 5); - return ret + 1; -} - -static const u16 *BufferQuestLogText_MovedMonBetweenBoxes(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_MOVED_MON_BETWEEN_BOXES, eventData); - boxIdxs = (const u8 *)eventData + 2; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonToNewBox); - return (const u16 *)boxIdxs + 1; -} - -static u16 *BufferQuestLogData_MovedMonWithinBox(u16 *a0, const u16 *eventData) -{ - u16 *r2; - r2 = sub_8113DE0(QL_EVENT_MOVED_MON_WITHIN_BOX, a0); - if (r2 == NULL) - return NULL; - r2[0] = eventData[0]; - *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); - return r2 + 2; -} - -static const u16 *BufferQuestLogText_MovedMonWithinBox(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_MOVED_MON_WITHIN_BOX, eventData); - boxIdxs = (const u8 *)eventData + 2; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonWithinBox); - return (const u16 *)boxIdxs + 1; -} - -static u16 *BufferQuestLogData_WithdrewMonFromPC(u16 *a0, const u16 *eventData) -{ - u16 *r2; - r2 = sub_8113DE0(QL_EVENT_WITHDREW_MON_PC, a0); - if (r2 == NULL) - return NULL; - r2[0] = eventData[0]; - *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); - return r2 + 2; -} - -static const u16 *BufferQuestLogText_WithdrewMonFromPC(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_WITHDREW_MON_PC, eventData); - boxIdxs = (const u8 *)eventData + 2; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewMonFromPC); - return (const u16 *)boxIdxs + 1; -} - -static u16 *BufferQuestLogData_DepositedMonInPC(u16 *a0, const u16 *eventData) -{ - u16 *r2; - r2 = sub_8113DE0(QL_EVENT_DEPOSITED_MON_PC, a0); - if (r2 == NULL) - return NULL; - r2[0] = eventData[0]; - *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); - return r2 + 2; -} - -static const u16 *BufferQuestLogText_DepositedMonInPC(const u16 *eventData) -{ - const u8 *boxIdxs; - eventData = sub_8113E88(QL_EVENT_DEPOSITED_MON_PC, eventData); - boxIdxs = (const u8 *)eventData + 2; - DynamicPlaceholderTextUtil_Reset(); - QuestLog_GetSpeciesName(eventData[0], NULL, 0); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0])); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DepositedMonInPC); - return (const u16 *)boxIdxs + 1; -} - -static u16 *BufferQuestLogData_SwitchedMultipleMons(u16 *a0, const u16 *eventData) -{ - u16 *r2; - r2 = sub_8113DE0(QL_EVENT_SWITCHED_MULTIPLE_MONS, a0); - if (r2 == NULL) - return NULL; - *((u8 *)r2 + 0) = *((const u8 *)eventData + 4); - *((u8 *)r2 + 1) = *((const u8 *)eventData + 5); - return r2 + 1; -} - -static const u16 *BufferQuestLogText_SwitchedMultipleMons(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_SWITCHED_MULTIPLE_MONS, eventData); - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0))); - if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1)) - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_QuestLog_ADifferentSpot); - else - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1))); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMultipleMons); - return r4 + 1; -} - -static u16 *BufferQuestLogData_DepositedItemInPC(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_DEPOSITED_ITEM_PC, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - return a0 + 1; -} - -static const u16 *BufferQuestLogText_DepositedItemInPC(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_DEPOSITED_ITEM_PC, eventData); - CopyItemName(r4[0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_StoredItemInPC); - return r4 + 1; -} - -static u16 *BufferQuestLogData_WithdrewItemFromPC(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_WITHDREW_ITEM_PC, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - return a0 + 1; -} - -static const u16 *BufferQuestLogText_WithdrewItemFromPC(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_WITHDREW_ITEM_PC, eventData); - CopyItemName(r4[0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewItemFromPC); - return r4 + 1; -} - -u16 *BufferQuestLogData_DefeatedTrainer_(u16 eventId, u16 *a1, const u16 *a2) -{ - a1 = sub_8113DE0(eventId, a1); - if (a1 == NULL) - return NULL; - a1[0] = a2[1]; - a1[1] = a2[2]; - a1[2] = a2[0]; - *((u8 *)a1 + 6) = *((const u8 *)a2 + 7); - *((u8 *)a1 + 7) = *((const u8 *)a2 + 6); - return a1 + 4; -} - -static u16 *BufferQuestLogData_DefeatedGymLeader(u16 *a0, const u16 *eventData) -{ - gUnknown_203B048 = 1; - return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_GYM_LEADER, a0, eventData); -} - -static const u16 *BufferQuestLogText_DefeatedGymLeader(const u16 *eventData) -{ - const u8 *r6; - eventData = sub_8113E88(QL_EVENT_DEFEATED_GYM_LEADER, eventData); - r6 = (const u8 *)eventData + 6; - DynamicPlaceholderTextUtil_Reset(); - GetMapNameGeneric(gStringVar1, r6[0]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[eventData[2]].trainerName); - QuestLog_GetSpeciesName(eventData[0], 0, 2); - QuestLog_GetSpeciesName(eventData[1], 0, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnGymLeadersMonWithMonAndWon); - return eventData + 4; -} - -static u16 *BufferQuestLogData_DefeatedWildMon(u16 *a0, const u16 *eventData) -{ - u16 *r4 = a0; - u8 *r5 = (u8 *)a0 + 8; - if (!sub_8110944(r4, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) - return NULL; - if (r5[0] == 0 && r5[1] == 0) - { - r4[0] = QL_EVENT_DEFEATED_WILD_MON; - r4[1] = sQuestLogCursor; - } - if (eventData[0]) - r4[2] = eventData[0]; - if (eventData[1]) - r4[3] = eventData[1]; - if (eventData[0] && r5[0] != 0xFF) - r5[0]++; - if (eventData[1] && r5[1] != 0xFF) - r5[1]++; - r5[2] = *((const u8 *)eventData + 4); - return (u16 *)(r5 + 4); -} - -static const u16 *BufferQuestLogText_DefeatedWildMon(const u16 *a0) -{ - const u8 *data; - if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) - return NULL; - - data = (const u8 *)a0 + 8; - DynamicPlaceholderTextUtil_Reset(); - GetMapNameGeneric(gStringVar1, data[2]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - QuestLog_GetSpeciesName(a0[2], NULL, 1); - ConvertIntToDecimalStringN(gStringVar2, data[0], STR_CONV_MODE_LEFT_ALIGN, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); - QuestLog_GetSpeciesName(a0[3], NULL, 3); - ConvertIntToDecimalStringN(gStringVar3, data[1], STR_CONV_MODE_LEFT_ALIGN, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName); - if (data[0] == 0) - { - if (data[1] == 1) - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMon); - else - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMons); - } - else if (data[1] == 0) - { - if (data[0] == 1) - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMon); - else - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMons); - } - else if (data[0] == 1) - { - if (data[1] == 1) - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMon); - else - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMons); - } - else - { - if (data[1] == 1) - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMon); - else - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMons); - } - return (const u16 *)(data + 4); -} - -static bool8 IsSpeciesFromSpecialEncounter(u16 species) -{ - switch (species) - { - case SPECIES_SNORLAX: - case SPECIES_ARTICUNO: - case SPECIES_ZAPDOS: - case SPECIES_MOLTRES: - case SPECIES_MEWTWO: - case SPECIES_LUGIA: - case SPECIES_HO_OH: - case SPECIES_DEOXYS: - return TRUE; - } - return FALSE; -} - -static u16 *BufferQuestLogData_DefeatedEliteFourMember(u16 *a0, const u16 *eventData) -{ - gUnknown_203B048 = 1; - return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_E4_MEMBER, a0, eventData); -} - -static const u16 *BufferQuestLogText_DefeatedEliteFourMember(const u16 *eventData) -{ - const u8 *r5; - eventData = sub_8113E88(QL_EVENT_DEFEATED_E4_MEMBER, eventData); - r5 = (const u8 *)eventData + 6; - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gTrainers[eventData[2]].trainerName); - QuestLog_GetSpeciesName(eventData[0], NULL, 1); - QuestLog_GetSpeciesName(eventData[1], NULL, 2); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, sDefeatedOpponentFlavorTexts[r5[1]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnEliteFoursMonWithMonAndWon); - return eventData + 4; -} - -static u16 *BufferQuestLogData_DefeatedChampion(u16 *a0, const u16 *eventData) -{ - if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) - return NULL; - a0[0] = 0x2021; - a0[1] = sQuestLogCursor; - a0[2] = eventData[1]; - a0[3] = eventData[2]; - *((u8 *)a0 + 8) = *((const u8 *)eventData + 6); - gUnknown_203B048 = 1; - return a0 + 5; -} - -static const u16 *BufferQuestLogText_DefeatedChampion(const u16 *a0) -{ - const u8 *r5; - if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) - return NULL; - - r5 = (const u8 *)a0 + 8; - DynamicPlaceholderTextUtil_Reset(); - - switch (gUnknown_203B044.unk_2) - { - case 0: - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerBattledChampionRival); - break; - case 1: - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName); - QuestLog_GetSpeciesName(a0[2], NULL, 1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName); - QuestLog_GetSpeciesName(a0[3], NULL, 3); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2); - break; - case 2: - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sDefeatedChampionFlavorTexts[r5[0]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WonTheMatchAsAResult); - break; - } - return (const u16 *)(r5 + 2); -} - -static u16 *BufferQuestLogData_DefeatedTrainer(u16 *a0, const u16 *eventData) -{ - gUnknown_203B048 = 1; - return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_TRAINER, a0, eventData); -} - -static const u16 *BufferQuestLogText_DefeatedTrainer(const u16 *eventData) -{ - const u16 *r5 = sub_8113E88(QL_EVENT_DEFEATED_TRAINER, eventData); - const u8 *r6 = (const u8 *)r5 + 6; - DynamicPlaceholderTextUtil_Reset(); - GetMapNameGeneric(gStringVar1, r6[0]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - - if (gTrainers[r5[2]].trainerClass == CLASS_RIVAL - || gTrainers[r5[2]].trainerClass == CLASS_RIVAL_2 - || gTrainers[r5[2]].trainerClass == CLASS_CHAMPION_2) - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL)); - else - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[r5[2]].trainerName); - - QuestLog_GetSpeciesName(r5[0], NULL, 2); - QuestLog_GetSpeciesName(r5[1], NULL, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnTrainersMonWithMonAndWon); - return (const u16 *)(r6 + 2); -} - -static const u8 *const sLocationNameTexts[] = -{ - [QL_LOCATION_HOME] = gText_QuestLog_Home, - [QL_LOCATION_OAKS_LAB] = gText_QuestLog_OakResearchLab, - [QL_LOCATION_VIRIDIAN_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_LEAGUE_GATE_1] = gText_QuestLog_PokemonLeagueGate, - [QL_LOCATION_LEAGUE_GATE_2] = gText_QuestLog_PokemonLeagueGate, - [QL_LOCATION_VIRIDIAN_FOREST_1] = gText_QuestLog_ViridianForest, - [QL_LOCATION_VIRIDIAN_FOREST_2] = gText_QuestLog_ViridianForest, - [QL_LOCATION_PEWTER_MUSEUM] = gText_QuestLog_PewterMuseumOfScience, - [QL_LOCATION_PEWTER_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_MT_MOON_1] = gText_QuestLog_MtMoon, - [QL_LOCATION_MT_MOON_2] = gText_QuestLog_MtMoon, - [QL_LOCATION_CERULEAN_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_BIKE_SHOP] = gText_QuestLog_BikeShop, - [QL_LOCATION_BILLS_HOUSE] = gText_QuestLog_BillsHouse, - [QL_LOCATION_DAY_CARE] = gText_QuestLog_DayCare, - [QL_LOCATION_UNDERGROUND_PATH_1] = gText_QuestLog_UndergroundPath, - [QL_LOCATION_UNDERGROUND_PATH_2] = gText_QuestLog_UndergroundPath, - [QL_LOCATION_PKMN_FAN_CLUB] = gText_QuestLog_PokemonFanClub, - [QL_LOCATION_VERMILION_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_SS_ANNE] = gText_QuestLog_SSAnne, - [QL_LOCATION_DIGLETTS_CAVE_1] = gText_QuestLog_DiglettsCave, - [QL_LOCATION_DIGLETTS_CAVE_2] = gText_QuestLog_DiglettsCave, - [QL_LOCATION_ROCK_TUNNEL_1] = gText_QuestLog_RockTunnel, - [QL_LOCATION_ROCK_TUNNEL_2] = gText_QuestLog_RockTunnel, - [QL_LOCATION_POWER_PLANT] = gText_QuestLog_PowerPlant, - [QL_LOCATION_PKMN_TOWER] = gText_QuestLog_PokemonTower, - [QL_LOCATION_VOLUNTEER_HOUSE] = gText_QuestLog_VolunteerHouse, - [QL_LOCATION_NAME_RATERS_HOUSE] = gText_QuestLog_NameRatersHouse, - [QL_LOCATION_UNDERGROUND_PATH_3] = gText_QuestLog_UndergroundPath, - [QL_LOCATION_UNDERGROUND_PATH_4] = gText_QuestLog_UndergroundPath, - [QL_LOCATION_CELADON_DEPT_STORE] = gText_QuestLog_CeladonDeptStore, - [QL_LOCATION_CELADON_MANSION] = gText_QuestLog_CeladonMansion, - [QL_LOCATION_GAME_CORNER] = gText_QuestLog_RocketGameCorner, - [QL_LOCATION_CELADON_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_CELADON_RESTAURANT] = gText_QuestLog_Restaurant, - [QL_LOCATION_ROCKET_HIDEOUT] = gText_QuestLog_RocketHideout, - [QL_LOCATION_SAFARI_ZONE] = gText_QuestLog_SafariZone, - [QL_LOCATION_FUCHSIA_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_WARDENS_HOME] = gText_QuestLog_WardensHome, - [QL_LOCATION_FIGHTING_DOJO] = gText_QuestLog_FightingDojo, - [QL_LOCATION_SAFFRON_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_SILPH_CO] = gText_QuestLog_SilphCo, - [QL_LOCATION_SEAFOAM_ISLANDS_1] = gText_QuestLog_SeafoamIslands, - [QL_LOCATION_SEAFOAM_ISLANDS_2] = gText_QuestLog_SeafoamIslands, - [QL_LOCATION_PKMN_MANSION] = gText_QuestLog_PokemonMansion, - [QL_LOCATION_CINNABAR_GYM] = gText_QuestLog_Gym, - [QL_LOCATION_CINNABAR_LAB] = gText_QuestLog_PokemonResearchLab, - [QL_LOCATION_VICTORY_ROAD_1] = gText_QuestLog_VictoryRoad, - [QL_LOCATION_VICTORY_ROAD_2] = gText_QuestLog_VictoryRoad, - [QL_LOCATION_PKMN_LEAGUE] = gText_QuestLog_PokemonLeague, - [QL_LOCATION_CERULEAN_CAVE] = gText_QuestLog_CeruleanCave -}; - -static const u8 *const sDepartedLocationTexts[] = -{ - [QL_DEPARTED_TOWN_BUILDING] = gText_QuestLog_DepartedPlaceInTownForNextDestination, - [QL_DEPARTED_MUSEUM] = gText_QuestLog_LeftTownsLocationForNextDestination, - [QL_DEPARTED_GAME_CORNER] = gText_QuestLog_PlayedGamesAtGameCorner, - [QL_DEPARTED_HOME] = gText_QuestLog_RestedAtHome, - [QL_DEPARTED_OAKS_LAB] = gText_QuestLog_LeftOaksLab, - [QL_DEPARTED_GYM] = gText_QuestLog_GymWasFullOfToughTrainers, - [QL_DEPARTED_SAFARI_ZONE] = gText_QuestLog_HadGreatTimeInSafariZone, - [QL_DEPARTED_CAVE] = gText_QuestLog_ManagedToGetOutOfLocation, - [QL_DEPARTED_MISC_BUILDING_1] = gText_QuestLog_DepartedTheLocationForNextDestination, - [QL_DEPARTED_MISC_BUILDING_2] = gText_QuestLog_DepartedFromLocationToNextDestination -}; - -static const u8 sLocationToDepartedTextId[] = -{ - [QL_LOCATION_HOME] = QL_DEPARTED_HOME, - [QL_LOCATION_OAKS_LAB] = QL_DEPARTED_OAKS_LAB, - [QL_LOCATION_VIRIDIAN_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_LEAGUE_GATE_1] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_LEAGUE_GATE_2] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_VIRIDIAN_FOREST_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_VIRIDIAN_FOREST_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_PEWTER_MUSEUM] = QL_DEPARTED_MUSEUM, - [QL_LOCATION_PEWTER_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_MT_MOON_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_MT_MOON_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_CERULEAN_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_BIKE_SHOP] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_BILLS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_DAY_CARE] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_UNDERGROUND_PATH_1] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_UNDERGROUND_PATH_2] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_PKMN_FAN_CLUB] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_VERMILION_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_SS_ANNE] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_DIGLETTS_CAVE_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_DIGLETTS_CAVE_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_ROCK_TUNNEL_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_ROCK_TUNNEL_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_POWER_PLANT] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_PKMN_TOWER] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_VOLUNTEER_HOUSE] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_NAME_RATERS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_UNDERGROUND_PATH_3] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_UNDERGROUND_PATH_4] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_CELADON_DEPT_STORE] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_CELADON_MANSION] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_GAME_CORNER] = QL_DEPARTED_GAME_CORNER, - [QL_LOCATION_CELADON_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_CELADON_RESTAURANT] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_ROCKET_HIDEOUT] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_SAFARI_ZONE] = QL_DEPARTED_SAFARI_ZONE, - [QL_LOCATION_FUCHSIA_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_WARDENS_HOME] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_FIGHTING_DOJO] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_SAFFRON_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_SILPH_CO] = QL_DEPARTED_MISC_BUILDING_2, - [QL_LOCATION_SEAFOAM_ISLANDS_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_SEAFOAM_ISLANDS_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_PKMN_MANSION] = QL_DEPARTED_MISC_BUILDING_2, - [QL_LOCATION_CINNABAR_GYM] = QL_DEPARTED_GYM, - [QL_LOCATION_CINNABAR_LAB] = QL_DEPARTED_TOWN_BUILDING, - [QL_LOCATION_VICTORY_ROAD_1] = QL_DEPARTED_CAVE, - [QL_LOCATION_VICTORY_ROAD_2] = QL_DEPARTED_CAVE, - [QL_LOCATION_PKMN_LEAGUE] = QL_DEPARTED_MISC_BUILDING_1, - [QL_LOCATION_CERULEAN_CAVE] = QL_DEPARTED_CAVE -}; - -static const u8 gUnknown_8456C17[] = { - 0x5a, - 0x5b, - 0x5d, - 0x5e, - 0x5f, - 0x62, - 0x60, - 0x59 -}; - -static const u8 *const sUsedFieldMoveTexts[] = -{ - [FIELD_MOVE_FLASH] = gText_QuestLog_UsedFlash, - [FIELD_MOVE_CUT] = gText_QuestLog_UsedCut, - [FIELD_MOVE_FLY] = gText_QuestLog_UsedFly, - [FIELD_MOVE_STRENGTH] = gText_QuestLog_UsedStrength, - [FIELD_MOVE_SURF] = gText_QuestLog_UsedSurf, - [FIELD_MOVE_ROCK_SMASH] = gText_QuestLog_UsedRockSmash, - [FIELD_MOVE_WATERFALL] = gText_QuestLog_UsedWaterfall, - [FIELD_MOVE_TELEPORT] = gText_QuestLog_UsedTeleportToLocation, - [FIELD_MOVE_DIG] = gText_QuestLog_UsedDigInLocation, - [FIELD_MOVE_MILK_DRINK] = gText_QuestLog_UsedMilkDrink, - [FIELD_MOVE_SOFT_BOILED] = gText_QuestLog_UsedSoftboiled, - [FIELD_MOVE_SWEET_SCENT] = gText_QuestLog_UsedSweetScent -}; - -static u16 *BufferQuestLogData_DepartedLocation(u16 *a0, const u16 *eventData) -{ - u16 *r2 = sub_8113DE0(QL_EVENT_DEPARTED, a0); - if (r2 == NULL) - return NULL; - *((u8 *)r2 + 0) = *((const u8 *)eventData + 0); - if ((*((u8 *)r2 + 1) = *((const u8 *)eventData + 1)) == 0x24) - gUnknown_203B048 = 1; - return r2 + 1; -} - -static const u16 *BufferQuestLogText_DepartedLocation(const u16 *eventData) -{ - u8 r4, locationId; - const u16 *r5 = sub_8113E88(QL_EVENT_DEPARTED, eventData); - const u8 *r5_2 = (const u8 *)r5 + 0; - locationId = r5_2[1]; - GetMapNameGeneric(gStringVar1, r5_2[0]); - StringCopy(gStringVar2, sLocationNameTexts[locationId]); - if (sLocationToDepartedTextId[locationId] == QL_DEPARTED_GYM) - { - for (r4 = 0; r4 < ARRAY_COUNT(gUnknown_8456C17); r4++) - { - if (r5_2[0] != gUnknown_8456C17[r4]) - continue; - if (FlagGet(FLAG_BADGE01_GET + r4) == TRUE) - StringExpandPlaceholders(gStringVar4, gText_QuestLog_DepartedGym); - else - StringExpandPlaceholders(gStringVar4, gText_QuestLog_GymWasFullOfToughTrainers); - break; - } - if (r4 == 8) - StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); - } - else - StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); - - return (const u16 *)(r5_2 + 2); -} - -void sub_811539C(void) -{ - gUnknown_203B04B = TRUE; -} - -static bool8 sub_81153A8(u16 eventId, const u16 *eventData) -{ - if (eventId != QL_EVENT_DEPARTED) - { - gUnknown_203B04A = 0; - return TRUE; - } - if (gUnknown_203B04A == *((u8 *)eventData + 1) + 1) - return FALSE; - gUnknown_203B04A = *((u8 *)eventData + 1) + 1; - return TRUE; -} - -static bool8 sub_81153E4(u16 eventId, const u16 *eventData) -{ - if (eventId != QL_EVENT_DEPARTED) - return TRUE; - - if (*((u8 *)eventData + 1) == 32 && !gUnknown_203B04B) - return FALSE; - - gUnknown_203B04B = FALSE; - return TRUE; -} - -static u16 *BufferQuestLogData_UsedFieldMove(u16 *a0, const u16 *eventData) -{ - u8 *r3; - a0 = sub_8113DE0(QL_EVENT_USED_FIELD_MOVE, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - r3 = (u8 *)a0 + 2; - r3[0] = *((const u8 *)eventData + 2); - r3[1] = *((const u8 *)eventData + 3); - if (r3[0] == FIELD_MOVE_TELEPORT || r3[0] == FIELD_MOVE_DIG) - gUnknown_203B048 = 2; - else - gUnknown_203B048 = 1; - return (u16 *)(r3 + 2); -} - -static const u16 *BufferQuestLogText_UsedFieldMove(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_USED_FIELD_MOVE, eventData); - const u8 *r5 = (const u8 *)r4 + 2; - QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); - if (r5[1] != 0xFF) - GetMapNameGeneric(gStringVar2, r5[1]); - - // If used Teleport, get name of destination - if (r5[0] == FIELD_MOVE_TELEPORT) - { - if (r5[1] == 0x58) - StringCopy(gStringVar3, gText_QuestLog_Home); - else - StringCopy(gStringVar3, gText_PokemonCenter); - } - - StringExpandPlaceholders(gStringVar4, sUsedFieldMoveTexts[r5[0]]); - return (const u16 *)(r5 + 2); -} - -static u16 *BufferQuestLogData_BoughtItem(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_BOUGHT_ITEM, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[2]; - a0[1] = eventData[3]; - a0[2] = *((const u32 *)eventData) >> 16; - a0[3] = *((const u32 *)eventData); - *((u8 *)a0 + 8) = *((const u8 *)eventData + 8); - *((u8 *)a0 + 9) = 1; - return a0 + 5; -} - -static const u16 *BufferQuestLogText_BoughtItem(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_BOUGHT_ITEM, eventData); - const u8 *r7 = (const u8 *)r4 + 8; - u32 r6 = (r4[2] << 16) + r4[3]; - DynamicPlaceholderTextUtil_Reset(); - GetMapNameGeneric(gStringVar1, r7[0]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0])); - if (r4[1] < 2) - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItem); - else - { - ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItemsIncludingItem); - } - return (const u16 *)(r7 + 2); -} - -static u16 *BufferQuestLogData_SoldItem(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_SOLD_ITEM, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[2]; - a0[1] = eventData[3]; - a0[2] = *((const u32 *)eventData) >> 16; - a0[3] = *((const u32 *)eventData); - *((u8 *)a0 + 8) = *((const u8 *)eventData + 8); - *((u8 *)a0 + 9) = *((const u8 *)eventData + 9); - return a0 + 5; -} - -static const u16 *BufferQuestLogText_SoldItem(const u16 *eventData) -{ - const u16 *r5 = sub_8113E88(QL_EVENT_SOLD_ITEM, eventData); - const u8 *r7 = (const u8 *) r5 + 8; - u32 r6 = (r5[2] << 16) + r5[3]; - DynamicPlaceholderTextUtil_Reset(); - GetMapNameGeneric(gStringVar1, r7[0]); - if (r7[1] == 0) { - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0])); - if (r5[1] == 1) - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gText_QuestLog_JustOne); - else - { - ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gText_QuestLog_Num); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); - } - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldNumOfItem); - } - else - { - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0])); - ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldItemsIncludingItem); - } - return (const u16 *)(r7 + 2); -} - -static u16 *BufferQuestLogData_ObtainedItem(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_OBTAINED_ITEM, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - *((u8 *)a0 + 2) = *((const u8 *)eventData + 2); - return a0 + 2; -} - -static const u16 *BufferQuestLogText_ObtainedItem(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_OBTAINED_ITEM, eventData); - const u8 *r5 = (const u8 *)r4 + 2; - GetMapNameGeneric(gStringVar1, r5[0]); - StringCopy(gStringVar2, ItemId_GetName(r4[0])); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_ObtainedItemInLocation); - return (const u16 *)(r5 + 2); -} - -static const u16 sQuestLogWorldMapFlags[] = -{ - FLAG_WORLD_MAP_VIRIDIAN_CITY, - FLAG_WORLD_MAP_PEWTER_CITY, - FLAG_WORLD_MAP_CERULEAN_CITY, - FLAG_WORLD_MAP_LAVENDER_TOWN, - FLAG_WORLD_MAP_VERMILION_CITY, - FLAG_WORLD_MAP_CELADON_CITY, - FLAG_WORLD_MAP_FUCHSIA_CITY, - FLAG_WORLD_MAP_CINNABAR_ISLAND, - FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR, - FLAG_WORLD_MAP_SAFFRON_CITY, - FLAG_WORLD_MAP_ONE_ISLAND, - FLAG_WORLD_MAP_TWO_ISLAND, - FLAG_WORLD_MAP_THREE_ISLAND, - FLAG_WORLD_MAP_FOUR_ISLAND, - FLAG_WORLD_MAP_FIVE_ISLAND, - FLAG_WORLD_MAP_SEVEN_ISLAND, - FLAG_WORLD_MAP_SIX_ISLAND -}; - -void QuestLog_RecordEnteredMap(u16 worldMapFlag) -{ - s32 i; - - if (QL_IS_PLAYBACK_STATE) - return; - - for (i = 0; i < (int)NELEMS(sQuestLogWorldMapFlags); i++) - { - if (worldMapFlag == sQuestLogWorldMapFlags[i]) - { - if (!FlagGet(worldMapFlag)) - { - sNewlyEnteredMap = TRUE; - break; - } - else - { - sNewlyEnteredMap += 0; - sNewlyEnteredMap = FALSE; - break; - } - } - } -} - -void sub_8115798(void) -{ - u16 sp0; - if (!QL_IS_PLAYBACK_STATE) - { - if (sNewlyEnteredMap) - { - sp0 = gMapHeader.regionMapSectionId; - SetQuestLogEvent(QL_EVENT_ARRIVED, &sp0); - sNewlyEnteredMap = FALSE; - } - } -} - -static u16 *BufferQuestLogData_ArrivedInLocation(u16 *a0, const u16 *eventData) -{ - a0 = sub_8113DE0(QL_EVENT_ARRIVED, a0); - if (a0 == NULL) - return NULL; - a0[0] = eventData[0]; - return a0 + 1; -} - -static const u16 *BufferQuestLogText_ArrivedInLocation(const u16 *eventData) -{ - const u16 *r4 = sub_8113E88(QL_EVENT_ARRIVED, eventData); - GetMapNameGeneric(gStringVar1, (u8)r4[0]); - StringExpandPlaceholders(gStringVar4, gText_QuestLog_ArrivedInLocation); - return r4 + 1; -} - -static void BufferLinkPartnersName(u8 *dest) -{ - s32 i; - if (*dest++ == EXT_CTRL_CODE_BEGIN && *dest++ == EXT_CTRL_CODE_JPN) - { - for (i = 0; i < 5; i++) - { - if (*dest == EXT_CTRL_CODE_BEGIN) - break; - dest++; - } - *dest++ = EXT_CTRL_CODE_BEGIN; - *dest++ = EXT_CTRL_CODE_ENG; - *dest++ = EOS; - } -} diff --git a/src/quest_log_events.c b/src/quest_log_events.c new file mode 100644 index 000000000..31f249484 --- /dev/null +++ b/src/quest_log_events.c @@ -0,0 +1,2148 @@ +#include "global.h" +#include "gflib.h" +#include "battle.h" +#include "data.h" +#include "dynamic_placeholder_text_util.h" +#include "event_data.h" +#include "event_scripts.h" +#include "menu_helpers.h" +#include "item.h" +#include "link.h" +#include "quest_log.h" +#include "party_menu.h" +#include "pokemon_storage_system.h" +#include "region_map.h" +#include "strings.h" +#include "constants/maps.h" +#include "constants/flags.h" +#include "constants/trainer_classes.h" +#include "constants/species.h" +#include "constants/items.h" +#include "constants/region_map_sections.h" + +static EWRAM_DATA struct UnkStruct_203B024 gUnknown_203B024 = {0}; +EWRAM_DATA struct UnkStruct_203B044 gUnknown_203B044 = {0}; +static EWRAM_DATA u8 gUnknown_203B048 = 0; +static EWRAM_DATA bool8 sNewlyEnteredMap = FALSE; +static EWRAM_DATA u8 gUnknown_203B04A = 0; +static EWRAM_DATA bool8 gUnknown_203B04B = FALSE; + +static bool8 InQuestLogDisabledLocation(void); +static bool8 sub_8113778(u16, const u16 *); +static bool8 sub_81137E4(u16, const u16 *); +static u16 *sub_8113828(u16, const u16 *); +static bool8 TrySetLinkQuestLogEvent(u16, const u16 *); +static bool8 TrySetTrainerBattleQuestLogEvent(u16, const u16 *); +static bool8 IsQuestLogEventWithSpecialEncounterSpecies(u16, const u16 *); +static void sub_8113B94(u16); +static u16 *TryRecordEvent41(u16 *, u16); +static u16 *BufferQuestLogData_SwitchedPartyOrder(u16 *, const u16 *); +static u16 *BufferQuestLogData_UsedItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_GaveHeldItemFromPartyMenu(u16 *, const u16 *); +static u16 *BufferQuestLogData_GaveHeldItemFromBagMenu(u16 *, const u16 *); +static u16 *BufferQuestLogData_GaveHeldItemFromPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_TookHeldItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwappedHeldItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwappedHeldItemFromPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_UsedPkmnCenter(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkTraded(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkBattledSingle(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkBattledDouble(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkBattledMulti(u16 *, const u16 *); +static u16 *BufferQuestLogData_UsedUnionRoom(u16 *, const u16 *); +static u16 *BufferQuestLogData_UsedUnionRoomChat(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *, const u16 *); +static u16 *BufferQuestLogData_LinkBattledUnionRoom(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwitchedMonsBetweenBoxes(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwitchedMonsWithinBox(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwitchedPartyMonForPCMon(u16 *, const u16 *); +static u16 *BufferQuestLogData_MovedMonBetweenBoxes(u16 *, const u16 *); +static u16 *BufferQuestLogData_MovedMonWithinBox(u16 *, const u16 *); +static u16 *BufferQuestLogData_WithdrewMonFromPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_DepositedMonInPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_SwitchedMultipleMons(u16 *, const u16 *); +static u16 *BufferQuestLogData_DepositedItemInPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_WithdrewItemFromPC(u16 *, const u16 *); +static u16 *BufferQuestLogData_DefeatedGymLeader(u16 *, const u16 *); +static u16 *BufferQuestLogData_DefeatedWildMon(u16 *, const u16 *); +static u16 *BufferQuestLogData_DefeatedEliteFourMember(u16 *, const u16 *); +static u16 *BufferQuestLogData_DefeatedChampion(u16 *, const u16 *); +static u16 *BufferQuestLogData_DefeatedTrainer(u16 *, const u16 *); +static u16 *BufferQuestLogData_DepartedLocation(u16 *, const u16 *); +static u16 *BufferQuestLogData_UsedFieldMove(u16 *, const u16 *); +static u16 *BufferQuestLogData_BoughtItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_SoldItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_ObtainedItem(u16 *, const u16 *); +static u16 *BufferQuestLogData_ArrivedInLocation(u16 *, const u16 *); +static const u16 *BufferQuestLogText_SwitchedPartyOrder(const u16 *); +static const u16 *BufferQuestLogText_UsedItem(const u16 *); +static const u16 *BufferQuestLogText_GaveHeldItemFromPartyMenu(const u16 *); +static const u16 *BufferQuestLogText_GaveHeldItemFromBagMenu(const u16 *); +static const u16 *BufferQuestLogText_GaveHeldItemFromPC(const u16 *); +static const u16 *BufferQuestLogText_TookHeldItem(const u16 *); +static const u16 *BufferQuestLogText_SwappedHeldItem(const u16 *); +static const u16 *BufferQuestLogText_SwappedHeldItemFromPC(const u16 *); +static const u16 *BufferQuestLogText_UsedPkmnCenter(const u16 *); +static const u16 *BufferQuestLogText_LinkTraded(const u16 *); +static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *); +static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *); +static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *); +static const u16 *BufferQuestLogText_UsedUnionRoom(const u16 *); +static const u16 *BufferQuestLogText_UsedUnionRoomChat(const u16 *); +static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *); +static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *); +static const u16 *BufferQuestLogText_SwitchedMonsBetweenBoxes(const u16 *); +static const u16 *BufferQuestLogText_SwitchedMonsWithinBox(const u16 *); +static const u16 *BufferQuestLogText_SwitchedPartyMonForPCMon(const u16 *); +static const u16 *BufferQuestLogText_MovedMonBetweenBoxes(const u16 *); +static const u16 *BufferQuestLogText_MovedMonWithinBox(const u16 *); +static const u16 *BufferQuestLogText_WithdrewMonFromPC(const u16 *); +static const u16 *BufferQuestLogText_DepositedMonInPC(const u16 *); +static const u16 *BufferQuestLogText_SwitchedMultipleMons(const u16 *); +static const u16 *BufferQuestLogText_DepositedItemInPC(const u16 *); +static const u16 *BufferQuestLogText_WithdrewItemFromPC(const u16 *); +static const u16 *BufferQuestLogText_DefeatedGymLeader(const u16 *); +static const u16 *BufferQuestLogText_DefeatedWildMon(const u16 *); +static const u16 *BufferQuestLogText_DefeatedEliteFourMember(const u16 *); +static const u16 *BufferQuestLogText_DefeatedChampion(const u16 *); +static const u16 *BufferQuestLogText_DefeatedTrainer(const u16 *); +static const u16 *BufferQuestLogText_DepartedLocation(const u16 *); +static const u16 *BufferQuestLogText_UsedFieldMove(const u16 *); +static const u16 *BufferQuestLogText_BoughtItem(const u16 *); +static const u16 *BufferQuestLogText_SoldItem(const u16 *); +static const u16 *BufferQuestLogText_ObtainedItem(const u16 *); +static const u16 *BufferQuestLogText_ArrivedInLocation(const u16 *); +static bool8 IsSpeciesFromSpecialEncounter(u16); +static bool8 sub_81153A8(u16, const u16 *); +static bool8 sub_81153E4(u16, const u16 *); +static void BufferLinkPartnersName(u8 *); + +static u16 *(*const sQuestLogStorageCBs[])(u16 *, const u16 *) = { + [QL_EVENT_0] = NULL, + [QL_EVENT_1] = NULL, + [QL_EVENT_2] = NULL, + [QL_EVENT_SWITCHED_PARTY_ORDER] = BufferQuestLogData_SwitchedPartyOrder, + [QL_EVENT_USED_ITEM] = BufferQuestLogData_UsedItem, + [QL_EVENT_GAVE_HELD_ITEM] = BufferQuestLogData_GaveHeldItemFromPartyMenu, + [QL_EVENT_GAVE_HELD_ITEM_BAG] = BufferQuestLogData_GaveHeldItemFromBagMenu, + [QL_EVENT_GAVE_HELD_ITEM_PC] = BufferQuestLogData_GaveHeldItemFromPC, + [QL_EVENT_TOOK_HELD_ITEM] = BufferQuestLogData_TookHeldItem, + [QL_EVENT_SWAPPED_HELD_ITEM] = BufferQuestLogData_SwappedHeldItem, + [QL_EVENT_SWAPPED_HELD_ITEM_PC] = BufferQuestLogData_SwappedHeldItemFromPC, + [QL_EVENT_USED_PKMN_CENTER] = BufferQuestLogData_UsedPkmnCenter, + [QL_EVENT_LINK_TRADED] = BufferQuestLogData_LinkTraded, + [QL_EVENT_LINK_BATTLED_SINGLE] = BufferQuestLogData_LinkBattledSingle, + [QL_EVENT_LINK_BATTLED_DOUBLE] = BufferQuestLogData_LinkBattledDouble, + [QL_EVENT_LINK_BATTLED_MULTI] = BufferQuestLogData_LinkBattledMulti, + [QL_EVENT_USED_UNION_ROOM] = BufferQuestLogData_UsedUnionRoom, + [QL_EVENT_USED_UNION_ROOM_CHAT] = BufferQuestLogData_UsedUnionRoomChat, + [QL_EVENT_LINK_TRADED_UNION] = BufferQuestLogData_LinkTradedUnionRoom, + [QL_EVENT_LINK_BATTLED_UNION] = BufferQuestLogData_LinkBattledUnionRoom, + [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = BufferQuestLogData_SwitchedMonsBetweenBoxes, + [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = BufferQuestLogData_SwitchedMonsWithinBox, + [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = BufferQuestLogData_SwitchedPartyMonForPCMon, + [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = BufferQuestLogData_MovedMonBetweenBoxes, + [QL_EVENT_MOVED_MON_WITHIN_BOX] = BufferQuestLogData_MovedMonWithinBox, + [QL_EVENT_WITHDREW_MON_PC] = BufferQuestLogData_WithdrewMonFromPC, + [QL_EVENT_DEPOSITED_MON_PC] = BufferQuestLogData_DepositedMonInPC, + [QL_EVENT_SWITCHED_MULTIPLE_MONS] = BufferQuestLogData_SwitchedMultipleMons, + [QL_EVENT_DEPOSITED_ITEM_PC] = BufferQuestLogData_DepositedItemInPC, + [QL_EVENT_WITHDREW_ITEM_PC] = BufferQuestLogData_WithdrewItemFromPC, + [QL_EVENT_DEFEATED_GYM_LEADER] = BufferQuestLogData_DefeatedGymLeader, + [QL_EVENT_DEFEATED_WILD_MON] = BufferQuestLogData_DefeatedWildMon, + [QL_EVENT_DEFEATED_E4_MEMBER] = BufferQuestLogData_DefeatedEliteFourMember, + [QL_EVENT_DEFEATED_CHAMPION] = BufferQuestLogData_DefeatedChampion, + [QL_EVENT_DEFEATED_TRAINER] = BufferQuestLogData_DefeatedTrainer, + [QL_EVENT_DEPARTED] = BufferQuestLogData_DepartedLocation, + [QL_EVENT_USED_FIELD_MOVE] = BufferQuestLogData_UsedFieldMove, + [QL_EVENT_BOUGHT_ITEM] = BufferQuestLogData_BoughtItem, + [QL_EVENT_SOLD_ITEM] = BufferQuestLogData_SoldItem, + [QL_EVENT_39] = NULL, + [QL_EVENT_OBTAINED_ITEM] = BufferQuestLogData_ObtainedItem, + [QL_EVENT_41] = NULL, + [QL_EVENT_ARRIVED] = BufferQuestLogData_ArrivedInLocation +}; + +void SetQuestLogEvent(u16 eventId, const u16 *eventData) +{ + u16 *r1; + + if (eventId == QL_EVENT_DEPARTED && gUnknown_203B048 == 2) + { + sub_811381C(); + return; + } + sub_811381C(); + if (gQuestLogState == QL_STATE_PLAYBACK) + return; + + if (!IS_VALID_QL_EVENT(eventId)) + return; + + if (InQuestLogDisabledLocation() == TRUE) + return; + + if (TrySetLinkQuestLogEvent(eventId, eventData) == TRUE) + return; + + if (MenuHelpers_LinkSomething() == TRUE) + return; + + if (InUnionRoom() == TRUE) + return; + + if (TrySetTrainerBattleQuestLogEvent(eventId, eventData) == TRUE) + return; + + if (IsQuestLogEventWithSpecialEncounterSpecies(eventId, eventData) == TRUE) + return; + + if (sub_81153E4(eventId, eventData) == FALSE) + return; + + if (gQuestLogPlaybackState == 0) + { + if (sub_8113778(eventId, eventData) == TRUE) + return; + + if (eventId != QL_EVENT_DEFEATED_WILD_MON || gUnknown_203AE04 == NULL) + { + if (sub_81153A8(eventId, eventData) == FALSE) + return; + StartRecordingQuestLogEntry(eventId); + } + } + else if (eventId == QL_EVENT_OBTAINED_ITEM) + return; + + sub_8113B94(eventId); + if (eventId == QL_EVENT_DEFEATED_WILD_MON) + { + if (gUnknown_203AE04 == NULL) + { + gUnknown_203AE04 = sEventRecordingPointer; + r1 = sQuestLogStorageCBs[eventId](gUnknown_203AE04, eventData); + } + else + { + sQuestLogStorageCBs[eventId](gUnknown_203AE04, eventData); + return; + } + } + else + { + gUnknown_203AE04 = NULL; + r1 = sQuestLogStorageCBs[eventId](sEventRecordingPointer, eventData); + } + + if (r1 == NULL) + { + FinishRecordingQuestLogScene(); + r1 = sub_8113828(eventId, eventData); + if (r1 == NULL) + return; + } + + sEventRecordingPointer = r1; + if (gUnknown_203B048 == 0) + return; + FinishRecordingQuestLogScene(); +} + +static bool8 InQuestLogDisabledLocation(void) +{ + // In Trainer Tower + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F) + && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))) + return TRUE; + + // In pokemon trainer fan club + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB)) + return TRUE; + + // In E-Reader house + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_HOUSE_ROOM1) && + (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM1) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_HOUSE_ROOM2))) + return TRUE; + + // In elevator + if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR)) + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR)) + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)) + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR))) + return TRUE; + + return FALSE; +} + +bool8 QuestLog_ShouldEndSceneOnMapChange(void) +{ + if (InQuestLogDisabledLocation() != TRUE) + return FALSE; + + if (gQuestLogState == QL_STATE_PLAYBACK) + return TRUE; + + if (gQuestLogState == QL_STATE_RECORDING) + QuestLog_CutRecording(); + + return FALSE; +} + +static bool8 sub_8113778(u16 eventId, const u16 *eventData) +{ + if (eventId == QL_EVENT_USED_FIELD_MOVE || eventId == QL_EVENT_USED_PKMN_CENTER) + return TRUE; + + if (!FlagGet(FLAG_SYS_GAME_CLEAR)) + { + if (eventId == QL_EVENT_SWITCHED_PARTY_ORDER || eventId == QL_EVENT_DEFEATED_WILD_MON || sub_81137E4(eventId, eventData) == TRUE) + return TRUE; + } + + if (!FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) + { + if (eventId == QL_EVENT_USED_ITEM + || eventId == QL_EVENT_GAVE_HELD_ITEM + || eventId == QL_EVENT_GAVE_HELD_ITEM_BAG + || eventId == QL_EVENT_GAVE_HELD_ITEM_PC + || eventId == QL_EVENT_TOOK_HELD_ITEM + || eventId == QL_EVENT_SWAPPED_HELD_ITEM + || eventId == QL_EVENT_SWAPPED_HELD_ITEM_PC + || eventId == QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON + || eventId == QL_EVENT_WITHDREW_MON_PC + || eventId == QL_EVENT_DEPOSITED_MON_PC) + return TRUE; + } + + return FALSE; +} + +static bool8 sub_81137E4(u16 eventId, const u16 *eventData) +{ + if (eventId == QL_EVENT_DEFEATED_TRAINER) + { + u8 trainerClass = gTrainers[*eventData].trainerClass; + if ( trainerClass == CLASS_RIVAL + || trainerClass == CLASS_RIVAL_2 + || trainerClass == CLASS_CHAMPION_2 + || trainerClass == CLASS_BOSS) + return FALSE; + return TRUE; + } + return FALSE; +} + +void sub_811381C(void) +{ + gUnknown_203B048 = 0; +} + +static u16 *sub_8113828(u16 eventId, const u16 *eventData) +{ + if (sub_8113778(eventId, eventData) == TRUE) + return NULL; + + if (sub_81153A8(eventId, eventData) == FALSE) + return NULL; + + StartRecordingQuestLogEntry(eventId); + sub_8113B94(eventId); + + if (eventId == QL_EVENT_DEFEATED_WILD_MON) + gUnknown_203AE04 = sEventRecordingPointer; + else + gUnknown_203AE04 = NULL; + + return sQuestLogStorageCBs[eventId](sEventRecordingPointer, eventData); +} + +static bool8 TrySetLinkQuestLogEvent(u16 eventId, const u16 *eventData) +{ + if (!IS_LINK_QL_EVENT(eventId)) + return FALSE; + + sub_81138F8(); + gUnknown_203B024.unk_00 = eventId; + + if (eventId != QL_EVENT_USED_UNION_ROOM && eventId != QL_EVENT_USED_UNION_ROOM_CHAT) + { + if (eventId == QL_EVENT_LINK_TRADED || eventId == QL_EVENT_LINK_TRADED_UNION) + memcpy(gUnknown_203B024.unk_04, eventData, 12); + else + memcpy(gUnknown_203B024.unk_04, eventData, 24); + } + return TRUE; +} + +void sub_81138F8(void) +{ + gUnknown_203B024 = (struct UnkStruct_203B024){}; +} + +void QuestLog_StartRecordingInputsAfterDeferredEvent(void) +{ + if (gUnknown_203B024.unk_00 != QL_EVENT_0) + { + u16 *resp; + gUnknown_203B04A = 0; + StartRecordingQuestLogEntry(gUnknown_203B024.unk_00); + resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](sEventRecordingPointer, gUnknown_203B024.unk_04); + sEventRecordingPointer = resp; + sub_81138F8(); + } +} + +static bool8 TrySetTrainerBattleQuestLogEvent(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEFEATED_TRAINER + && eventId != QL_EVENT_DEFEATED_GYM_LEADER + && eventId != QL_EVENT_DEFEATED_E4_MEMBER + && eventId != QL_EVENT_DEFEATED_CHAMPION) + return FALSE; + + sub_81138F8(); + if (gQuestLogPlaybackState != 0 || FlagGet(FLAG_SYS_GAME_CLEAR) || sub_81137E4(eventId, eventData) != TRUE) + { + gUnknown_203B024.unk_00 = eventId; + memcpy(gUnknown_203B024.unk_04, eventData, 8); + } + return TRUE; +} + +void sub_81139BC(void) +{ + if (gUnknown_203B024.unk_00 != QL_EVENT_0) + { + u16 *resp; + if (gQuestLogPlaybackState == 0) + { + gUnknown_203B04A = 0; + StartRecordingQuestLogEntry(gUnknown_203B024.unk_00); + } + sub_8113B94(gUnknown_203B024.unk_00); + resp = sQuestLogStorageCBs[gUnknown_203B024.unk_00](sEventRecordingPointer, gUnknown_203B024.unk_04); + sEventRecordingPointer = resp; + TryRecordEvent41_IncCursor(1); + sub_81138F8(); + FinishRecordingQuestLogScene(); + } +} + +void TryRecordEvent41_IncCursor(u16 a0) +{ + sEventRecordingPointer = TryRecordEvent41(sEventRecordingPointer, a0); + sQuestLogCursor++; +} + +static bool8 IsQuestLogEventWithSpecialEncounterSpecies(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEFEATED_WILD_MON) + return FALSE; + + if (IsSpeciesFromSpecialEncounter(eventData[0]) == TRUE) + return TRUE; + + if (IsSpeciesFromSpecialEncounter(eventData[1]) == TRUE) + return TRUE; + + return FALSE; +} + +static const u16 *(*const sQuestLogEventTextBufferCBs[])(const u16 *) = { + [QL_EVENT_0] = NULL, + [QL_EVENT_1] = NULL, + [QL_EVENT_2] = NULL, + [QL_EVENT_SWITCHED_PARTY_ORDER] = BufferQuestLogText_SwitchedPartyOrder, + [QL_EVENT_USED_ITEM] = BufferQuestLogText_UsedItem, + [QL_EVENT_GAVE_HELD_ITEM] = BufferQuestLogText_GaveHeldItemFromPartyMenu, + [QL_EVENT_GAVE_HELD_ITEM_BAG] = BufferQuestLogText_GaveHeldItemFromBagMenu, + [QL_EVENT_GAVE_HELD_ITEM_PC] = BufferQuestLogText_GaveHeldItemFromPC, + [QL_EVENT_TOOK_HELD_ITEM] = BufferQuestLogText_TookHeldItem, + [QL_EVENT_SWAPPED_HELD_ITEM] = BufferQuestLogText_SwappedHeldItem, + [QL_EVENT_SWAPPED_HELD_ITEM_PC] = BufferQuestLogText_SwappedHeldItemFromPC, + [QL_EVENT_USED_PKMN_CENTER] = BufferQuestLogText_UsedPkmnCenter, + [QL_EVENT_LINK_TRADED] = BufferQuestLogText_LinkTraded, + [QL_EVENT_LINK_BATTLED_SINGLE] = BufferQuestLogText_LinkBattledSingle, + [QL_EVENT_LINK_BATTLED_DOUBLE] = BufferQuestLogText_LinkBattledDouble, + [QL_EVENT_LINK_BATTLED_MULTI] = BufferQuestLogText_LinkBattledMulti, + [QL_EVENT_USED_UNION_ROOM] = BufferQuestLogText_UsedUnionRoom, + [QL_EVENT_USED_UNION_ROOM_CHAT] = BufferQuestLogText_UsedUnionRoomChat, + [QL_EVENT_LINK_TRADED_UNION] = BufferQuestLogText_LinkTradedUnionRoom, + [QL_EVENT_LINK_BATTLED_UNION] = BufferQuestLogText_LinkBattledUnionRoom, + [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = BufferQuestLogText_SwitchedMonsBetweenBoxes, + [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = BufferQuestLogText_SwitchedMonsWithinBox, + [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = BufferQuestLogText_SwitchedPartyMonForPCMon, + [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = BufferQuestLogText_MovedMonBetweenBoxes, + [QL_EVENT_MOVED_MON_WITHIN_BOX] = BufferQuestLogText_MovedMonWithinBox, + [QL_EVENT_WITHDREW_MON_PC] = BufferQuestLogText_WithdrewMonFromPC, + [QL_EVENT_DEPOSITED_MON_PC] = BufferQuestLogText_DepositedMonInPC, + [QL_EVENT_SWITCHED_MULTIPLE_MONS] = BufferQuestLogText_SwitchedMultipleMons, + [QL_EVENT_DEPOSITED_ITEM_PC] = BufferQuestLogText_DepositedItemInPC, + [QL_EVENT_WITHDREW_ITEM_PC] = BufferQuestLogText_WithdrewItemFromPC, + [QL_EVENT_DEFEATED_GYM_LEADER] = BufferQuestLogText_DefeatedGymLeader, + [QL_EVENT_DEFEATED_WILD_MON] = BufferQuestLogText_DefeatedWildMon, + [QL_EVENT_DEFEATED_E4_MEMBER] = BufferQuestLogText_DefeatedEliteFourMember, + [QL_EVENT_DEFEATED_CHAMPION] = BufferQuestLogText_DefeatedChampion, + [QL_EVENT_DEFEATED_TRAINER] = BufferQuestLogText_DefeatedTrainer, + [QL_EVENT_DEPARTED] = BufferQuestLogText_DepartedLocation, + [QL_EVENT_USED_FIELD_MOVE] = BufferQuestLogText_UsedFieldMove, + [QL_EVENT_BOUGHT_ITEM] = BufferQuestLogText_BoughtItem, + [QL_EVENT_SOLD_ITEM] = BufferQuestLogText_SoldItem, + [QL_EVENT_39] = NULL, + [QL_EVENT_OBTAINED_ITEM] = BufferQuestLogText_ObtainedItem, + [QL_EVENT_41] = NULL, + [QL_EVENT_ARRIVED] = BufferQuestLogText_ArrivedInLocation +}; + +static const u8 sQuestLogEventCmdSizes[] = { + [QL_EVENT_0] = 0x08, + [QL_EVENT_1] = 0x08, + [QL_EVENT_2] = 0x08, + [QL_EVENT_SWITCHED_PARTY_ORDER] = 0x08, + [QL_EVENT_USED_ITEM] = 0x0a, + [QL_EVENT_GAVE_HELD_ITEM] = 0x08, + [QL_EVENT_GAVE_HELD_ITEM_BAG] = 0x08, + [QL_EVENT_GAVE_HELD_ITEM_PC] = 0x08, + [QL_EVENT_TOOK_HELD_ITEM] = 0x08, + [QL_EVENT_SWAPPED_HELD_ITEM] = 0x0a, + [QL_EVENT_SWAPPED_HELD_ITEM_PC] = 0x0a, + [QL_EVENT_USED_PKMN_CENTER] = 0x04, + [QL_EVENT_LINK_TRADED] = 0x10, + [QL_EVENT_LINK_BATTLED_SINGLE] = 0x0c, + [QL_EVENT_LINK_BATTLED_DOUBLE] = 0x0c, + [QL_EVENT_LINK_BATTLED_MULTI] = 0x1a, + [QL_EVENT_USED_UNION_ROOM] = 0x04, + [QL_EVENT_USED_UNION_ROOM_CHAT] = 0x04, + [QL_EVENT_LINK_TRADED_UNION] = 0x10, + [QL_EVENT_LINK_BATTLED_UNION] = 0x0c, + [QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES] = 0x0a, + [QL_EVENT_SWITCHED_MONS_WITHIN_BOX] = 0x0a, + [QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON] = 0x0a, + [QL_EVENT_MOVED_MON_BETWEEN_BOXES] = 0x08, + [QL_EVENT_MOVED_MON_WITHIN_BOX] = 0x08, + [QL_EVENT_WITHDREW_MON_PC] = 0x08, + [QL_EVENT_DEPOSITED_MON_PC] = 0x08, + [QL_EVENT_SWITCHED_MULTIPLE_MONS] = 0x06, + [QL_EVENT_DEPOSITED_ITEM_PC] = 0x06, + [QL_EVENT_WITHDREW_ITEM_PC] = 0x06, + [QL_EVENT_DEFEATED_GYM_LEADER] = 0x0c, + [QL_EVENT_DEFEATED_WILD_MON] = 0x0c, + [QL_EVENT_DEFEATED_E4_MEMBER] = 0x0c, + [QL_EVENT_DEFEATED_CHAMPION] = 0x0a, + [QL_EVENT_DEFEATED_TRAINER] = 0x0c, + [QL_EVENT_DEPARTED] = 0x06, + [QL_EVENT_USED_FIELD_MOVE] = 0x08, + [QL_EVENT_BOUGHT_ITEM] = 0x0e, + [QL_EVENT_SOLD_ITEM] = 0x0e, + [QL_EVENT_39] = 0x02, + [QL_EVENT_OBTAINED_ITEM] = 0x08, + [QL_EVENT_41] = 0x04, + [QL_EVENT_ARRIVED] = 0x06 +}; + +u16 *QuestLog_SkipCommand(u16 *curPtr, u16 **prevPtr_p) +{ + u16 eventId = curPtr[0] & 0xfff; + u16 cnt = curPtr[0] >> 12; + + if (eventId == QL_EVENT_DEFEATED_CHAMPION) + cnt = 0; + + if (!IS_VALID_QL_EVENT(eventId)) + return NULL; + + *prevPtr_p = curPtr; + return sQuestLogEventCmdSizes[eventId] + (sQuestLogEventCmdSizes[eventId] - 4) * cnt + (void *)curPtr; +} + +void sub_8113ABC(const u16 *a0) +{ + const u8 *r2 = (const u8 *)(a0 + 2); + if ((a0[0] & 0xFFF) != QL_EVENT_DEPARTED) + gUnknown_203B04A = 0; + else + gUnknown_203B04A = r2[1] + 1; +} + +bool8 sub_8113AE8(const u16 *a0) +{ +#ifndef NONMATCHING + register const u16 *r0 asm("r0") = a0; +#else + const u16 *r0 = a0; +#endif + + if (r0 == NULL || r0[1] > sQuestLogCursor) + return FALSE; + + sQuestLogEventTextBufferCBs[a0[0] & 0xFFF](a0); + gUnknown_203B044.unk_0 = a0[0]; + gUnknown_203B044.unk_1 = (a0[0] & 0xF000) >> 12; + if (gUnknown_203B044.unk_1 != 0) + gUnknown_203B044.unk_2 = 1; + return TRUE; +} + +bool8 sub_8113B44(const u16 *a0) +{ + if (gUnknown_203B044.unk_2 == 0) + return FALSE; + + sQuestLogEventTextBufferCBs[gUnknown_203B044.unk_0](a0); + gUnknown_203B044.unk_2++; + if (gUnknown_203B044.unk_2 > gUnknown_203B044.unk_1) + ResetUnk203B044(); + return TRUE; +} + +void ResetUnk203B044(void) +{ + gUnknown_203B044 = (struct UnkStruct_203B044){}; +} + +static void sub_8113B94(u16 eventId) +{ + if (gUnknown_203B044.unk_0 != (u8)eventId || gUnknown_203B044.unk_2 != sQuestLogCursor) + { + gUnknown_203B044.unk_0 = eventId; + gUnknown_203B044.unk_1 = 0; + gUnknown_203B044.unk_2 = sQuestLogCursor; + } + else if (gUnknown_203B044.unk_1 < 5) + gUnknown_203B044.unk_1++; +} + +void sub_8113BD8(void) +{ + sNewlyEnteredMap = FALSE; + gUnknown_203B04A = 0; + gUnknown_203B04B = FALSE; +} + +u16 *TryRecordEvent39_NoParams(u16 *a0) +{ + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_39])) + return NULL; + a0[0] = QL_EVENT_39; + return a0 + 1; +} + +u16 *sub_8113C20(u16 *a0, struct QuestLogEntry * a1) +{ + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_39])) + return NULL; + a1->unk_6 = 0xFF; + a1->unk_4 = 0; + a1->unk_0 = 0; + a1->unk_1 = 0; + a1->unk_2 = 0; + a1->unk_3 = 0; + return a0 + 1; +} + +static u16 *TryRecordEvent41(u16 *a0, u16 a1) +{ + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_41])) + return NULL; + a0[0] = QL_EVENT_41; + a0[1] = a1; + return a0 + 2; +} + +u16 *sub_8113C8C(u16 *a0, struct QuestLogEntry * a1) +{ + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_41])) + return NULL; + a1->unk_6 = 0xFE; + a1->unk_4 = a0[1]; + a1->unk_0 = 0; + a1->unk_1 = 0; + a1->unk_2 = 0; + a1->unk_3 = 0; + return a0 + 2; +} + +u16 *sub_8113CC8(u16 *a0, struct QuestLogEntry * a1) +{ + u8 *r6 = (u8 *)a0 + 4; + + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_0])) + return NULL; + a0[0] = 0; + a0[1] = a1->unk_4; + r6[0] = a1->unk_0; + r6[1] = a1->unk_1; + r6[2] = a1->unk_2; + r6[3] = a1->unk_3; + return (u16 *)(r6 + 4); +} + +u16 *sub_8113D08(u16 *a0, struct QuestLogEntry * a1) +{ + u8 *r6 = (u8 *)a0 + 4; + + if (!WillCommandOfSizeFitInSav1Record(a0, sQuestLogEventCmdSizes[QL_EVENT_0])) + return NULL; + a1->unk_6 = 2; + a1->unk_4 = a0[1]; + a1->unk_0 = r6[0]; + a1->unk_1 = r6[1]; + a1->unk_2 = r6[2]; + a1->unk_3 = r6[3]; + return (u16 *)(r6 + 4); +} + +u16 *sub_8113D48(u16 *a0, struct QuestLogEntry * a1) +{ + u16 *r4 = a0; + u8 *r6 = (u8 *)a0 + 4; + + if (!WillCommandOfSizeFitInSav1Record(r4, sQuestLogEventCmdSizes[QL_EVENT_2])) + return NULL; + if (a1->unk_6 == 0) + r4[0] = 2; + else + r4[0] = 1; + r4[1] = a1->unk_4; + r6[0] = a1->unk_0; + r6[1] = a1->unk_1; + r6[2] = a1->unk_2; + r6[3] = a1->unk_3; + return (u16 *)(r6 + 4); +} + +u16 *sub_8113D94(u16 *a0, struct QuestLogEntry * a1) +{ + u16 *r5 = a0; + u8 *r6 = (u8 *)a0 + 4; + + if (!WillCommandOfSizeFitInSav1Record(r5, sQuestLogEventCmdSizes[QL_EVENT_2])) + return NULL; + if (r5[0] == 2) + a1->unk_6 = 0; + else + a1->unk_6 = 1; + a1->unk_4 = r5[1]; + a1->unk_0 = r6[0]; + a1->unk_1 = r6[1]; + a1->unk_2 = r6[2]; + a1->unk_3 = r6[3]; + return (u16 *)(r6 + 4); +} + +u16 *sub_8113DE0(u16 eventId, u16 *a1) +{ + u8 cmdSize; + u16 *r5; + u8 r4; + u8 r1; + + if (gUnknown_203B044.unk_1 == 0) + cmdSize = sQuestLogEventCmdSizes[eventId]; + else + cmdSize = sQuestLogEventCmdSizes[eventId] - 4; + if (!sub_8110944(a1, cmdSize)) + return NULL; + + r5 = (void *)a1; + + if (gUnknown_203B044.unk_1 != 0) + r5 = (void *)r5 - (gUnknown_203B044.unk_1 * cmdSize + 4); + + if (gUnknown_203B044.unk_1 == 5) + { + for (r4 = 0; r4 < 4; r4++) + { + memcpy( + (void *)r5 + (r4 * cmdSize + 4), + (void *)r5 + ((r4 + 1) * cmdSize + 4), + cmdSize + ); + } + r1 = 4; + } + else + r1 = gUnknown_203B044.unk_1; + + r5[0] = eventId + (r1 << 12); + r5[1] = sQuestLogCursor; + r5 = (void *)r5 + (r1 * cmdSize + 4); + return r5; +} + +static const u16 *sub_8113E88(u16 eventId, const u16 *eventData) +{ + eventData = (const void *)eventData + (gUnknown_203B044.unk_2 * (sQuestLogEventCmdSizes[eventId] - 4) + 4); + return eventData; +} + +static void QuestLog_GetSpeciesName(u16 species, u8 *dest, u8 stringVarId) +{ + if (dest != NULL) + { + if (species != SPECIES_EGG) + GetSpeciesName(dest, species); + else + StringCopy(dest, gText_EggNickname); + } + else + { + if (species != SPECIES_EGG) + DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gSpeciesNames[species]); + else + DynamicPlaceholderTextUtil_SetPlaceholderPtr(stringVarId, gText_EggNickname); + } +} + +static u16 *BufferQuestLogData_SwitchedPartyOrder(u16 *a0, const u16 *eventData) +{ + u16 *r2 = sub_8113DE0(QL_EVENT_SWITCHED_PARTY_ORDER, a0); + if (r2 == NULL) + return NULL; + + r2[0] = eventData[0]; + r2[1] = eventData[1]; + return r2 + 2; +} + +static const u16 *BufferQuestLogText_SwitchedPartyOrder(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_SWITCHED_PARTY_ORDER, eventData); + QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); + QuestLog_GetSpeciesName(r4[1], gStringVar2, 0); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchMon1WithMon2); + r4 += 2; + return r4; +} + +static u16 *BufferQuestLogData_UsedItem(u16 *a0, const u16 *eventData) +{ + u16 *r2 = sub_8113DE0(QL_EVENT_USED_ITEM, a0); + if (r2 == NULL) + return NULL; + + r2[0] = eventData[0]; + r2[1] = eventData[2]; + r2[2] = eventData[3]; + + if (eventData[0] == ITEM_ESCAPE_ROPE) + gUnknown_203B048 = 2; + + return r2 + 3; +} + +static const u16 *BufferQuestLogText_UsedItem(const u16 *eventData) +{ + const u16 *r5 = sub_8113E88(QL_EVENT_USED_ITEM, eventData); + + switch (ItemId_GetPocket(r5[0])) + { + case POCKET_ITEMS: + case POCKET_POKE_BALLS: + case POCKET_BERRY_POUCH: + StringCopy(gStringVar1, ItemId_GetName(r5[0])); + if (r5[0] == ITEM_ESCAPE_ROPE) + { + GetMapNameGeneric(gStringVar2, (u8)r5[2]); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedEscapeRope); + } + else if (r5[1] != 0xFFFF) + { + QuestLog_GetSpeciesName(r5[1], gStringVar2, 0); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedItemOnMonAtThisLocation); + } + else + { + StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheItem); + } + break; + case POCKET_KEY_ITEMS: + StringCopy(gStringVar1, ItemId_GetName(r5[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheKeyItem); + break; + case POCKET_TM_CASE: + QuestLog_GetSpeciesName(r5[1], gStringVar1, 0); + StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(r5[0])]); + if (r5[2] != 0xFFFF) + { + StringCopy(gStringVar3, gMoveNames[r5[2]]); + if (r5[0] > ITEM_TM50) + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithHM); + else + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithTM); + } + else + { + if (r5[0] > ITEM_TM50) + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromHM); + else + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromTM); + } + break; + } + return r5 + 3; +} + +u16 *BufferQuestLogData_GiveTakeHeldItem(u16 eventId, u16 *a1, const u16 *eventData) +{ + u16 *r1 = sub_8113DE0(eventId, a1); + if (r1 == NULL) + return NULL; + + r1[0] = eventData[0]; + r1[1] = eventData[2]; + return r1 + 2; +} + +static u16 *BufferQuestLogData_GaveHeldItemFromPartyMenu(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM, a0, eventData); +} + +static const u16 *BufferQuestLogText_GaveHeldItemFromPartyMenu(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM, eventData); + QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); + StringCopy(gStringVar2, ItemId_GetName(r4[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem); + r4 += 2; + return r4; +} + +static u16 *BufferQuestLogData_GaveHeldItemFromBagMenu(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_BAG, a0, eventData); +} + +static const u16 *BufferQuestLogText_GaveHeldItemFromBagMenu(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM_BAG, eventData); + QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); + StringCopy(gStringVar2, ItemId_GetName(r4[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem2); + r4 += 2; + return r4; +} + +static u16 *BufferQuestLogData_GaveHeldItemFromPC(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_GAVE_HELD_ITEM_PC, a0, eventData); +} + +static const u16 *BufferQuestLogText_GaveHeldItemFromPC(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM_PC, eventData); + + QuestLog_GetSpeciesName(r4[1], gStringVar2, 0); + StringCopy(gStringVar1, ItemId_GetName(r4[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItemFromPC); + r4 += 2; + return r4; +} + +static u16 *BufferQuestLogData_TookHeldItem(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_GiveTakeHeldItem(QL_EVENT_TOOK_HELD_ITEM, a0, eventData); +} + +static const u16 *BufferQuestLogText_TookHeldItem(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_TOOK_HELD_ITEM, eventData); + + QuestLog_GetSpeciesName(r4[1], gStringVar1, 0); + StringCopy(gStringVar2, ItemId_GetName(r4[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_TookHeldItemFromMon); + r4 += 2; + return r4; +} + +u16 *BufferQuestLogData_SwappedHeldItem_(u16 eventId, u16 *a1, const u16 *eventData) +{ + u16 *r1 = sub_8113DE0(eventId, a1); + if (r1 == NULL) + return NULL; + + r1[0] = eventData[0]; + r1[1] = eventData[1]; + r1[2] = eventData[2]; + return r1 + 3; +} + +static u16 *BufferQuestLogData_SwappedHeldItem(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_SwappedHeldItem_(QL_EVENT_SWAPPED_HELD_ITEM, a0, eventData); +} + +static const u16 *BufferQuestLogText_SwappedHeldItem(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_SWAPPED_HELD_ITEM, eventData); + QuestLog_GetSpeciesName(r4[2], gStringVar1, 0); + StringCopy(gStringVar2, ItemId_GetName(r4[0])); // Item taken + StringCopy(gStringVar3, ItemId_GetName(r4[1])); // Item given + StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemsOnMon); + r4 += 3; + return r4; +} + +static u16 *BufferQuestLogData_SwappedHeldItemFromPC(u16 *a0, const u16 *eventData) +{ + return BufferQuestLogData_SwappedHeldItem_(QL_EVENT_SWAPPED_HELD_ITEM_PC, a0, eventData); +} + +static const u16 *BufferQuestLogText_SwappedHeldItemFromPC(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_SWAPPED_HELD_ITEM_PC, eventData); + QuestLog_GetSpeciesName(r4[2], gStringVar2, 0); + StringCopy(gStringVar3, ItemId_GetName(r4[0])); + StringCopy(gStringVar1, ItemId_GetName(r4[1])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemFromPC); + r4 += 3; + return r4; +} + +static u16 *BufferQuestLogData_UsedPkmnCenter(u16 *a0, const u16 *eventData) +{ + u16 *r4 = a0; + if (gUnknown_203B044.unk_0 == QL_EVENT_USED_PKMN_CENTER && gUnknown_203B044.unk_1 != 0) + return r4; + + if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_USED_PKMN_CENTER])) + return NULL; + + r4[0] = QL_EVENT_USED_PKMN_CENTER; + r4[1] = sQuestLogCursor; + return r4 + 2; +} + +static const u16 *BufferQuestLogText_UsedPkmnCenter(const u16 *a0) +{ + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonsWereFullyRestoredAtCenter); + a0 += 2; + return a0; +} + +static u16 *BufferQuestLogData_LinkTraded(u16 *a0, const u16 *eventData) +{ + u16 *r4 = a0 + 4; + + a0[0] = QL_EVENT_LINK_TRADED; + a0[1] = sQuestLogCursor; + a0[2] = eventData[0]; + a0[3] = eventData[1]; + eventData += 2; + memcpy(r4, eventData, 7); + r4 += 4; + return r4; +} + +static const u16 *BufferQuestLogText_LinkTraded(const u16 *a0) +{ + const u16 *r6 = a0 + 4; + + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH); + + BufferLinkPartnersName(gStringVar1); + QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); // Mon received + QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); // Mon sent + StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForPersonsMon2); + r6 += 4; + return r6; +} + +static const u8 *const sDefeatedOpponentFlavorTexts[] = { + gText_QuestLog_Handily, + gText_QuestLog_Tenaciously, + gText_QuestLog_Somehow +}; + +static const u8 *const sDefeatedChampionFlavorTexts[] = { + gText_QuestLog_Coolly, + gText_QuestLog_Somehow, + gText_QuestLog_Barely +}; + +static const u8 *const sBattleOutcomeTexts[] = { + gText_QuestLog_Win, + gText_QuestLog_Loss, + gText_QuestLog_Draw +}; + +static u16 *BufferQuestLogData_LinkBattledSingle(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_LINK_BATTLED_SINGLE; + a0[1] = sQuestLogCursor; + *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); + memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); + a0 += 6; + return a0; +} + +static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *a0) +{ + DynamicPlaceholderTextUtil_Reset(); + + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); + BufferLinkPartnersName(gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SingleBattleWithPersonResultedInOutcome); + a0 += 6; + return a0; +} + +static u16 *BufferQuestLogData_LinkBattledDouble(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_LINK_BATTLED_DOUBLE; + a0[1] = sQuestLogCursor; + *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); + memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); + a0 += 6; + return a0; +} + +static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *a0) +{ + DynamicPlaceholderTextUtil_Reset(); + + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); + BufferLinkPartnersName(gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DoubleBattleWithPersonResultedInOutcome); + a0 += 6; + return a0; +} + +static u16 *BufferQuestLogData_LinkBattledMulti(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_LINK_BATTLED_MULTI; + a0[1] = sQuestLogCursor; + *((u8 *)a0 + 4) = *((const u8 *)eventData + 0); + memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); + memcpy((u8 *)a0 + 12, (const u8 *)eventData + 8, PLAYER_NAME_LENGTH); + memcpy((u8 *)a0 + 19, (const u8 *)eventData + 15, PLAYER_NAME_LENGTH); + a0 += 13; + return a0; +} + +static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *a0) +{ + DynamicPlaceholderTextUtil_Reset(); + + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memset(gStringVar2, EOS, PLAYER_NAME_LENGTH + 1); + memset(gStringVar3, EOS, PLAYER_NAME_LENGTH + 1); + StringCopy7(gStringVar1, (const u8 *)a0 + 5); + StringCopy7(gStringVar2, (const u8 *)a0 + 12); + StringCopy7(gStringVar3, (const u8 *)a0 + 19); + BufferLinkPartnersName(gStringVar1); + BufferLinkPartnersName(gStringVar2); + BufferLinkPartnersName(gStringVar3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); // partner + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); // opponent 1 + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); // opponent 2 + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sBattleOutcomeTexts[((const u8 *)a0)[4]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MultiBattleWithPeopleResultedInOutcome); + a0 += 13; + return a0; +} + +static u16 *BufferQuestLogData_UsedUnionRoom(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_USED_UNION_ROOM; + a0[1] = sQuestLogCursor; + return a0 + 2; +} + +static const u16 *BufferQuestLogText_UsedUnionRoom(const u16 *a0) +{ + StringExpandPlaceholders(gStringVar4, gText_QuestLog_MingledInUnionRoom); + a0 += 2; + return a0; +} + +static u16 *BufferQuestLogData_UsedUnionRoomChat(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_USED_UNION_ROOM_CHAT; + a0[1] = sQuestLogCursor; + return a0 + 2; +} + +static const u16 *BufferQuestLogText_UsedUnionRoomChat(const u16 *a0) +{ + StringExpandPlaceholders(gStringVar4, gText_QuestLog_ChattedWithManyTrainers); + a0 += 2; + return a0; +} + +static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *a0, const u16 *eventData) +{ + u8 *r4 = (u8 *)(a0 + 4); + a0[0] = QL_EVENT_LINK_TRADED_UNION; + a0[1] = sQuestLogCursor; + a0[2] = eventData[0]; + a0[3] = eventData[1]; + memcpy(r4, eventData + 2, PLAYER_NAME_LENGTH); + r4 += 8; + return (u16 *)r4; +} + +static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *a0) +{ + const u8 *r6 = (const u8 *)(a0 + 4); + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH); + BufferLinkPartnersName(gStringVar1); + QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); + QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForTrainersMon2); + r6 += 8; + return (const u16 *)r6; +} + +static u16 *BufferQuestLogData_LinkBattledUnionRoom(u16 *a0, const u16 *eventData) +{ + a0[0] = QL_EVENT_LINK_BATTLED_UNION; + a0[1] = sQuestLogCursor; + *(u8 *)&a0[2] = *(const u8 *)&eventData[0]; + memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH); + a0 += 6; + return a0; +} + +static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *a0) +{ + memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1); + memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH); + BufferLinkPartnersName(gStringVar1); + StringCopy(gStringVar2, sBattleOutcomeTexts[*(const u8 *)&a0[2]]); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_BattledTrainerEndedInOutcome); + a0 += 6; + return a0; +} + +static u16 *BufferQuestLogData_SwitchedMonsBetweenBoxes(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + a0[1] = eventData[1]; + *((u8 *)a0 + 4) = *((const u8 *)eventData + 4); + *((u8 *)a0 + 5) = *((const u8 *)eventData + 5); + return a0 + 3; +} + +static const u16 *BufferQuestLogText_SwitchedMonsBetweenBoxes(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES, eventData); + boxIdxs = (const u8 *)eventData + 4; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); + QuestLog_GetSpeciesName(eventData[1], NULL, 3); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsBetweenBoxes); + return eventData + 3; +} + +static u16 *BufferQuestLogData_SwitchedMonsWithinBox(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + a0[1] = eventData[1]; + *((u8 *)a0 + 4) = *((const u8 *)eventData + 4); + return a0 + 3; +} + +static const u16 *BufferQuestLogText_SwitchedMonsWithinBox(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_SWITCHED_MONS_WITHIN_BOX, eventData); + boxIdxs = (const u8 *)eventData + 4; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + QuestLog_GetSpeciesName(eventData[1], NULL, 2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsWithinBox); + return eventData + 3; +} + +static u16 *BufferQuestLogData_SwitchedPartyMonForPCMon(u16 *a0, const u16 *eventData) +{ + u16 *r2; + u16 *ret; + r2 = sub_8113DE0(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, a0); + if (r2 == NULL) + return NULL; + ret = r2 + 2; + if (*((const u8 *)eventData + 4) == TOTAL_BOXES_COUNT) + { + r2[0] = eventData[1]; + r2[1] = eventData[0]; + *((u8 *)r2 + 4) = *((const u8 *)eventData + 5); + } + else + { + r2[0] = eventData[0]; + r2[1] = eventData[1]; + *((u8 *)r2 + 4) = *((const u8 *)eventData + 4); + } + return ret + 1; +} + +static const u16 *BufferQuestLogText_SwitchedPartyMonForPCMon(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON, eventData); + boxIdxs = (const u8 *)eventData + 4; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + QuestLog_GetSpeciesName(eventData[1], NULL, 2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedPartyMonForPCMon); + return eventData + 3; +} + +static u16 *BufferQuestLogData_MovedMonBetweenBoxes(u16 *a0, const u16 *eventData) +{ + u16 *r2; + u16 *ret; + r2 = sub_8113DE0(QL_EVENT_MOVED_MON_BETWEEN_BOXES, a0); + if (r2 == NULL) + return NULL; + r2[0] = eventData[0]; + ret = r2 + 1; + *((u8 *)ret + 0) = *((const u8 *)eventData + 4); + *((u8 *)ret + 1) = *((const u8 *)eventData + 5); + return ret + 1; +} + +static const u16 *BufferQuestLogText_MovedMonBetweenBoxes(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_MOVED_MON_BETWEEN_BOXES, eventData); + boxIdxs = (const u8 *)eventData + 2; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1])); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonToNewBox); + return (const u16 *)boxIdxs + 1; +} + +static u16 *BufferQuestLogData_MovedMonWithinBox(u16 *a0, const u16 *eventData) +{ + u16 *r2; + r2 = sub_8113DE0(QL_EVENT_MOVED_MON_WITHIN_BOX, a0); + if (r2 == NULL) + return NULL; + r2[0] = eventData[0]; + *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); + return r2 + 2; +} + +static const u16 *BufferQuestLogText_MovedMonWithinBox(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_MOVED_MON_WITHIN_BOX, eventData); + boxIdxs = (const u8 *)eventData + 2; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonWithinBox); + return (const u16 *)boxIdxs + 1; +} + +static u16 *BufferQuestLogData_WithdrewMonFromPC(u16 *a0, const u16 *eventData) +{ + u16 *r2; + r2 = sub_8113DE0(QL_EVENT_WITHDREW_MON_PC, a0); + if (r2 == NULL) + return NULL; + r2[0] = eventData[0]; + *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); + return r2 + 2; +} + +static const u16 *BufferQuestLogText_WithdrewMonFromPC(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_WITHDREW_MON_PC, eventData); + boxIdxs = (const u8 *)eventData + 2; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0])); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewMonFromPC); + return (const u16 *)boxIdxs + 1; +} + +static u16 *BufferQuestLogData_DepositedMonInPC(u16 *a0, const u16 *eventData) +{ + u16 *r2; + r2 = sub_8113DE0(QL_EVENT_DEPOSITED_MON_PC, a0); + if (r2 == NULL) + return NULL; + r2[0] = eventData[0]; + *((u8 *)r2 + 2) = *((const u8 *)eventData + 4); + return r2 + 2; +} + +static const u16 *BufferQuestLogText_DepositedMonInPC(const u16 *eventData) +{ + const u8 *boxIdxs; + eventData = sub_8113E88(QL_EVENT_DEPOSITED_MON_PC, eventData); + boxIdxs = (const u8 *)eventData + 2; + DynamicPlaceholderTextUtil_Reset(); + QuestLog_GetSpeciesName(eventData[0], NULL, 0); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0])); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DepositedMonInPC); + return (const u16 *)boxIdxs + 1; +} + +static u16 *BufferQuestLogData_SwitchedMultipleMons(u16 *a0, const u16 *eventData) +{ + u16 *r2; + r2 = sub_8113DE0(QL_EVENT_SWITCHED_MULTIPLE_MONS, a0); + if (r2 == NULL) + return NULL; + *((u8 *)r2 + 0) = *((const u8 *)eventData + 4); + *((u8 *)r2 + 1) = *((const u8 *)eventData + 5); + return r2 + 1; +} + +static const u16 *BufferQuestLogText_SwitchedMultipleMons(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_SWITCHED_MULTIPLE_MONS, eventData); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0))); + if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1)) + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_QuestLog_ADifferentSpot); + else + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1))); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMultipleMons); + return r4 + 1; +} + +static u16 *BufferQuestLogData_DepositedItemInPC(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_DEPOSITED_ITEM_PC, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + return a0 + 1; +} + +static const u16 *BufferQuestLogText_DepositedItemInPC(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_DEPOSITED_ITEM_PC, eventData); + CopyItemName(r4[0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_StoredItemInPC); + return r4 + 1; +} + +static u16 *BufferQuestLogData_WithdrewItemFromPC(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_WITHDREW_ITEM_PC, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + return a0 + 1; +} + +static const u16 *BufferQuestLogText_WithdrewItemFromPC(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_WITHDREW_ITEM_PC, eventData); + CopyItemName(r4[0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewItemFromPC); + return r4 + 1; +} + +u16 *BufferQuestLogData_DefeatedTrainer_(u16 eventId, u16 *a1, const u16 *a2) +{ + a1 = sub_8113DE0(eventId, a1); + if (a1 == NULL) + return NULL; + a1[0] = a2[1]; + a1[1] = a2[2]; + a1[2] = a2[0]; + *((u8 *)a1 + 6) = *((const u8 *)a2 + 7); + *((u8 *)a1 + 7) = *((const u8 *)a2 + 6); + return a1 + 4; +} + +static u16 *BufferQuestLogData_DefeatedGymLeader(u16 *a0, const u16 *eventData) +{ + gUnknown_203B048 = 1; + return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_GYM_LEADER, a0, eventData); +} + +static const u16 *BufferQuestLogText_DefeatedGymLeader(const u16 *eventData) +{ + const u8 *r6; + eventData = sub_8113E88(QL_EVENT_DEFEATED_GYM_LEADER, eventData); + r6 = (const u8 *)eventData + 6; + DynamicPlaceholderTextUtil_Reset(); + GetMapNameGeneric(gStringVar1, r6[0]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[eventData[2]].trainerName); + QuestLog_GetSpeciesName(eventData[0], 0, 2); + QuestLog_GetSpeciesName(eventData[1], 0, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnGymLeadersMonWithMonAndWon); + return eventData + 4; +} + +static u16 *BufferQuestLogData_DefeatedWildMon(u16 *a0, const u16 *eventData) +{ + u16 *r4 = a0; + u8 *r5 = (u8 *)a0 + 8; + if (!sub_8110944(r4, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) + return NULL; + if (r5[0] == 0 && r5[1] == 0) + { + r4[0] = QL_EVENT_DEFEATED_WILD_MON; + r4[1] = sQuestLogCursor; + } + if (eventData[0]) + r4[2] = eventData[0]; + if (eventData[1]) + r4[3] = eventData[1]; + if (eventData[0] && r5[0] != 0xFF) + r5[0]++; + if (eventData[1] && r5[1] != 0xFF) + r5[1]++; + r5[2] = *((const u8 *)eventData + 4); + return (u16 *)(r5 + 4); +} + +static const u16 *BufferQuestLogText_DefeatedWildMon(const u16 *a0) +{ + const u8 *data; + if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_WILD_MON])) + return NULL; + + data = (const u8 *)a0 + 8; + DynamicPlaceholderTextUtil_Reset(); + GetMapNameGeneric(gStringVar1, data[2]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + QuestLog_GetSpeciesName(a0[2], NULL, 1); + ConvertIntToDecimalStringN(gStringVar2, data[0], STR_CONV_MODE_LEFT_ALIGN, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + QuestLog_GetSpeciesName(a0[3], NULL, 3); + ConvertIntToDecimalStringN(gStringVar3, data[1], STR_CONV_MODE_LEFT_ALIGN, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName); + if (data[0] == 0) + { + if (data[1] == 1) + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMon); + else + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMons); + } + else if (data[1] == 0) + { + if (data[0] == 1) + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMon); + else + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMons); + } + else if (data[0] == 1) + { + if (data[1] == 1) + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMon); + else + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMons); + } + else + { + if (data[1] == 1) + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMon); + else + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMons); + } + return (const u16 *)(data + 4); +} + +static bool8 IsSpeciesFromSpecialEncounter(u16 species) +{ + switch (species) + { + case SPECIES_SNORLAX: + case SPECIES_ARTICUNO: + case SPECIES_ZAPDOS: + case SPECIES_MOLTRES: + case SPECIES_MEWTWO: + case SPECIES_LUGIA: + case SPECIES_HO_OH: + case SPECIES_DEOXYS: + return TRUE; + } + return FALSE; +} + +static u16 *BufferQuestLogData_DefeatedEliteFourMember(u16 *a0, const u16 *eventData) +{ + gUnknown_203B048 = 1; + return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_E4_MEMBER, a0, eventData); +} + +static const u16 *BufferQuestLogText_DefeatedEliteFourMember(const u16 *eventData) +{ + const u8 *r5; + eventData = sub_8113E88(QL_EVENT_DEFEATED_E4_MEMBER, eventData); + r5 = (const u8 *)eventData + 6; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gTrainers[eventData[2]].trainerName); + QuestLog_GetSpeciesName(eventData[0], NULL, 1); + QuestLog_GetSpeciesName(eventData[1], NULL, 2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, sDefeatedOpponentFlavorTexts[r5[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnEliteFoursMonWithMonAndWon); + return eventData + 4; +} + +static u16 *BufferQuestLogData_DefeatedChampion(u16 *a0, const u16 *eventData) +{ + if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) + return NULL; + a0[0] = 0x2021; + a0[1] = sQuestLogCursor; + a0[2] = eventData[1]; + a0[3] = eventData[2]; + *((u8 *)a0 + 8) = *((const u8 *)eventData + 6); + gUnknown_203B048 = 1; + return a0 + 5; +} + +static const u16 *BufferQuestLogText_DefeatedChampion(const u16 *a0) +{ + const u8 *r5; + if (!sub_8110944(a0, sQuestLogEventCmdSizes[QL_EVENT_DEFEATED_CHAMPION])) + return NULL; + + r5 = (const u8 *)a0 + 8; + DynamicPlaceholderTextUtil_Reset(); + + switch (gUnknown_203B044.unk_2) + { + case 0: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerBattledChampionRival); + break; + case 1: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName); + QuestLog_GetSpeciesName(a0[2], NULL, 1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName); + QuestLog_GetSpeciesName(a0[3], NULL, 3); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2); + break; + case 2: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sDefeatedChampionFlavorTexts[r5[0]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WonTheMatchAsAResult); + break; + } + return (const u16 *)(r5 + 2); +} + +static u16 *BufferQuestLogData_DefeatedTrainer(u16 *a0, const u16 *eventData) +{ + gUnknown_203B048 = 1; + return BufferQuestLogData_DefeatedTrainer_(QL_EVENT_DEFEATED_TRAINER, a0, eventData); +} + +static const u16 *BufferQuestLogText_DefeatedTrainer(const u16 *eventData) +{ + const u16 *r5 = sub_8113E88(QL_EVENT_DEFEATED_TRAINER, eventData); + const u8 *r6 = (const u8 *)r5 + 6; + DynamicPlaceholderTextUtil_Reset(); + GetMapNameGeneric(gStringVar1, r6[0]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + + if (gTrainers[r5[2]].trainerClass == CLASS_RIVAL + || gTrainers[r5[2]].trainerClass == CLASS_RIVAL_2 + || gTrainers[r5[2]].trainerClass == CLASS_CHAMPION_2) + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(PLACEHOLDER_ID_RIVAL)); + else + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[r5[2]].trainerName); + + QuestLog_GetSpeciesName(r5[0], NULL, 2); + QuestLog_GetSpeciesName(r5[1], NULL, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnTrainersMonWithMonAndWon); + return (const u16 *)(r6 + 2); +} + +static const u8 *const sLocationNameTexts[] = + { + [QL_LOCATION_HOME] = gText_QuestLog_Home, + [QL_LOCATION_OAKS_LAB] = gText_QuestLog_OakResearchLab, + [QL_LOCATION_VIRIDIAN_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_LEAGUE_GATE_1] = gText_QuestLog_PokemonLeagueGate, + [QL_LOCATION_LEAGUE_GATE_2] = gText_QuestLog_PokemonLeagueGate, + [QL_LOCATION_VIRIDIAN_FOREST_1] = gText_QuestLog_ViridianForest, + [QL_LOCATION_VIRIDIAN_FOREST_2] = gText_QuestLog_ViridianForest, + [QL_LOCATION_PEWTER_MUSEUM] = gText_QuestLog_PewterMuseumOfScience, + [QL_LOCATION_PEWTER_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_MT_MOON_1] = gText_QuestLog_MtMoon, + [QL_LOCATION_MT_MOON_2] = gText_QuestLog_MtMoon, + [QL_LOCATION_CERULEAN_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_BIKE_SHOP] = gText_QuestLog_BikeShop, + [QL_LOCATION_BILLS_HOUSE] = gText_QuestLog_BillsHouse, + [QL_LOCATION_DAY_CARE] = gText_QuestLog_DayCare, + [QL_LOCATION_UNDERGROUND_PATH_1] = gText_QuestLog_UndergroundPath, + [QL_LOCATION_UNDERGROUND_PATH_2] = gText_QuestLog_UndergroundPath, + [QL_LOCATION_PKMN_FAN_CLUB] = gText_QuestLog_PokemonFanClub, + [QL_LOCATION_VERMILION_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_SS_ANNE] = gText_QuestLog_SSAnne, + [QL_LOCATION_DIGLETTS_CAVE_1] = gText_QuestLog_DiglettsCave, + [QL_LOCATION_DIGLETTS_CAVE_2] = gText_QuestLog_DiglettsCave, + [QL_LOCATION_ROCK_TUNNEL_1] = gText_QuestLog_RockTunnel, + [QL_LOCATION_ROCK_TUNNEL_2] = gText_QuestLog_RockTunnel, + [QL_LOCATION_POWER_PLANT] = gText_QuestLog_PowerPlant, + [QL_LOCATION_PKMN_TOWER] = gText_QuestLog_PokemonTower, + [QL_LOCATION_VOLUNTEER_HOUSE] = gText_QuestLog_VolunteerHouse, + [QL_LOCATION_NAME_RATERS_HOUSE] = gText_QuestLog_NameRatersHouse, + [QL_LOCATION_UNDERGROUND_PATH_3] = gText_QuestLog_UndergroundPath, + [QL_LOCATION_UNDERGROUND_PATH_4] = gText_QuestLog_UndergroundPath, + [QL_LOCATION_CELADON_DEPT_STORE] = gText_QuestLog_CeladonDeptStore, + [QL_LOCATION_CELADON_MANSION] = gText_QuestLog_CeladonMansion, + [QL_LOCATION_GAME_CORNER] = gText_QuestLog_RocketGameCorner, + [QL_LOCATION_CELADON_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_CELADON_RESTAURANT] = gText_QuestLog_Restaurant, + [QL_LOCATION_ROCKET_HIDEOUT] = gText_QuestLog_RocketHideout, + [QL_LOCATION_SAFARI_ZONE] = gText_QuestLog_SafariZone, + [QL_LOCATION_FUCHSIA_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_WARDENS_HOME] = gText_QuestLog_WardensHome, + [QL_LOCATION_FIGHTING_DOJO] = gText_QuestLog_FightingDojo, + [QL_LOCATION_SAFFRON_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_SILPH_CO] = gText_QuestLog_SilphCo, + [QL_LOCATION_SEAFOAM_ISLANDS_1] = gText_QuestLog_SeafoamIslands, + [QL_LOCATION_SEAFOAM_ISLANDS_2] = gText_QuestLog_SeafoamIslands, + [QL_LOCATION_PKMN_MANSION] = gText_QuestLog_PokemonMansion, + [QL_LOCATION_CINNABAR_GYM] = gText_QuestLog_Gym, + [QL_LOCATION_CINNABAR_LAB] = gText_QuestLog_PokemonResearchLab, + [QL_LOCATION_VICTORY_ROAD_1] = gText_QuestLog_VictoryRoad, + [QL_LOCATION_VICTORY_ROAD_2] = gText_QuestLog_VictoryRoad, + [QL_LOCATION_PKMN_LEAGUE] = gText_QuestLog_PokemonLeague, + [QL_LOCATION_CERULEAN_CAVE] = gText_QuestLog_CeruleanCave + }; + +static const u8 *const sDepartedLocationTexts[] = + { + [QL_DEPARTED_TOWN_BUILDING] = gText_QuestLog_DepartedPlaceInTownForNextDestination, + [QL_DEPARTED_MUSEUM] = gText_QuestLog_LeftTownsLocationForNextDestination, + [QL_DEPARTED_GAME_CORNER] = gText_QuestLog_PlayedGamesAtGameCorner, + [QL_DEPARTED_HOME] = gText_QuestLog_RestedAtHome, + [QL_DEPARTED_OAKS_LAB] = gText_QuestLog_LeftOaksLab, + [QL_DEPARTED_GYM] = gText_QuestLog_GymWasFullOfToughTrainers, + [QL_DEPARTED_SAFARI_ZONE] = gText_QuestLog_HadGreatTimeInSafariZone, + [QL_DEPARTED_CAVE] = gText_QuestLog_ManagedToGetOutOfLocation, + [QL_DEPARTED_MISC_BUILDING_1] = gText_QuestLog_DepartedTheLocationForNextDestination, + [QL_DEPARTED_MISC_BUILDING_2] = gText_QuestLog_DepartedFromLocationToNextDestination + }; + +static const u8 sLocationToDepartedTextId[] = + { + [QL_LOCATION_HOME] = QL_DEPARTED_HOME, + [QL_LOCATION_OAKS_LAB] = QL_DEPARTED_OAKS_LAB, + [QL_LOCATION_VIRIDIAN_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_LEAGUE_GATE_1] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_LEAGUE_GATE_2] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_VIRIDIAN_FOREST_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_VIRIDIAN_FOREST_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_PEWTER_MUSEUM] = QL_DEPARTED_MUSEUM, + [QL_LOCATION_PEWTER_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_MT_MOON_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_MT_MOON_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_CERULEAN_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_BIKE_SHOP] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_BILLS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_DAY_CARE] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_UNDERGROUND_PATH_1] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_UNDERGROUND_PATH_2] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_PKMN_FAN_CLUB] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_VERMILION_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_SS_ANNE] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_DIGLETTS_CAVE_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_DIGLETTS_CAVE_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_ROCK_TUNNEL_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_ROCK_TUNNEL_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_POWER_PLANT] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_PKMN_TOWER] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_VOLUNTEER_HOUSE] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_NAME_RATERS_HOUSE] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_UNDERGROUND_PATH_3] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_UNDERGROUND_PATH_4] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_CELADON_DEPT_STORE] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_CELADON_MANSION] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_GAME_CORNER] = QL_DEPARTED_GAME_CORNER, + [QL_LOCATION_CELADON_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_CELADON_RESTAURANT] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_ROCKET_HIDEOUT] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_SAFARI_ZONE] = QL_DEPARTED_SAFARI_ZONE, + [QL_LOCATION_FUCHSIA_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_WARDENS_HOME] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_FIGHTING_DOJO] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_SAFFRON_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_SILPH_CO] = QL_DEPARTED_MISC_BUILDING_2, + [QL_LOCATION_SEAFOAM_ISLANDS_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_SEAFOAM_ISLANDS_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_PKMN_MANSION] = QL_DEPARTED_MISC_BUILDING_2, + [QL_LOCATION_CINNABAR_GYM] = QL_DEPARTED_GYM, + [QL_LOCATION_CINNABAR_LAB] = QL_DEPARTED_TOWN_BUILDING, + [QL_LOCATION_VICTORY_ROAD_1] = QL_DEPARTED_CAVE, + [QL_LOCATION_VICTORY_ROAD_2] = QL_DEPARTED_CAVE, + [QL_LOCATION_PKMN_LEAGUE] = QL_DEPARTED_MISC_BUILDING_1, + [QL_LOCATION_CERULEAN_CAVE] = QL_DEPARTED_CAVE + }; + +static const u8 sGymCityMapSecs[] = { + MAPSEC_PEWTER_CITY, + MAPSEC_CERULEAN_CITY, + MAPSEC_VERMILION_CITY, + MAPSEC_CELADON_CITY, + MAPSEC_FUCHSIA_CITY, + MAPSEC_SAFFRON_CITY, + MAPSEC_CINNABAR_ISLAND, + MAPSEC_VIRIDIAN_CITY +}; + +static const u8 *const sUsedFieldMoveTexts[] = + { + [FIELD_MOVE_FLASH] = gText_QuestLog_UsedFlash, + [FIELD_MOVE_CUT] = gText_QuestLog_UsedCut, + [FIELD_MOVE_FLY] = gText_QuestLog_UsedFly, + [FIELD_MOVE_STRENGTH] = gText_QuestLog_UsedStrength, + [FIELD_MOVE_SURF] = gText_QuestLog_UsedSurf, + [FIELD_MOVE_ROCK_SMASH] = gText_QuestLog_UsedRockSmash, + [FIELD_MOVE_WATERFALL] = gText_QuestLog_UsedWaterfall, + [FIELD_MOVE_TELEPORT] = gText_QuestLog_UsedTeleportToLocation, + [FIELD_MOVE_DIG] = gText_QuestLog_UsedDigInLocation, + [FIELD_MOVE_MILK_DRINK] = gText_QuestLog_UsedMilkDrink, + [FIELD_MOVE_SOFT_BOILED] = gText_QuestLog_UsedSoftboiled, + [FIELD_MOVE_SWEET_SCENT] = gText_QuestLog_UsedSweetScent + }; + +static u16 *BufferQuestLogData_DepartedLocation(u16 *a0, const u16 *eventData) +{ + u16 *r2 = sub_8113DE0(QL_EVENT_DEPARTED, a0); + if (r2 == NULL) + return NULL; + *((u8 *)r2 + 0) = *((const u8 *)eventData + 0); + if ((*((u8 *)r2 + 1) = *((const u8 *)eventData + 1)) == QL_LOCATION_SAFARI_ZONE) + gUnknown_203B048 = 1; + return r2 + 1; +} + +static const u16 *BufferQuestLogText_DepartedLocation(const u16 *eventData) +{ + u8 r4, locationId; + const u16 *r5 = sub_8113E88(QL_EVENT_DEPARTED, eventData); + const u8 *r5_2 = (const u8 *)r5 + 0; + locationId = r5_2[1]; + GetMapNameGeneric(gStringVar1, r5_2[0]); + StringCopy(gStringVar2, sLocationNameTexts[locationId]); + if (sLocationToDepartedTextId[locationId] == QL_DEPARTED_GYM) + { + for (r4 = 0; r4 < NELEMS(sGymCityMapSecs); r4++) + { + if (r5_2[0] != sGymCityMapSecs[r4]) + continue; + if (FlagGet(FLAG_BADGE01_GET + r4) == TRUE) + StringExpandPlaceholders(gStringVar4, gText_QuestLog_DepartedGym); + else + StringExpandPlaceholders(gStringVar4, gText_QuestLog_GymWasFullOfToughTrainers); + break; + } + if (r4 == 8) + StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); + } + else + StringExpandPlaceholders(gStringVar4, sDepartedLocationTexts[sLocationToDepartedTextId[locationId]]); + + return (const u16 *)(r5_2 + 2); +} + +void sub_811539C(void) +{ + gUnknown_203B04B = TRUE; +} + +static bool8 sub_81153A8(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEPARTED) + { + gUnknown_203B04A = 0; + return TRUE; + } + if (gUnknown_203B04A == *((u8 *)eventData + 1) + 1) + return FALSE; + gUnknown_203B04A = *((u8 *)eventData + 1) + 1; + return TRUE; +} + +static bool8 sub_81153E4(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEPARTED) + return TRUE; + + if (*((u8 *)eventData + 1) == 32 && !gUnknown_203B04B) + return FALSE; + + gUnknown_203B04B = FALSE; + return TRUE; +} + +static u16 *BufferQuestLogData_UsedFieldMove(u16 *a0, const u16 *eventData) +{ + u8 *r3; + a0 = sub_8113DE0(QL_EVENT_USED_FIELD_MOVE, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + r3 = (u8 *)a0 + 2; + r3[0] = *((const u8 *)eventData + 2); + r3[1] = *((const u8 *)eventData + 3); + if (r3[0] == FIELD_MOVE_TELEPORT || r3[0] == FIELD_MOVE_DIG) + gUnknown_203B048 = 2; + else + gUnknown_203B048 = 1; + return (u16 *)(r3 + 2); +} + +static const u16 *BufferQuestLogText_UsedFieldMove(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_USED_FIELD_MOVE, eventData); + const u8 *r5 = (const u8 *)r4 + 2; + QuestLog_GetSpeciesName(r4[0], gStringVar1, 0); + if (r5[1] != 0xFF) + GetMapNameGeneric(gStringVar2, r5[1]); + + // If used Teleport, get name of destination + if (r5[0] == FIELD_MOVE_TELEPORT) + { + if (r5[1] == 0x58) + StringCopy(gStringVar3, gText_QuestLog_Home); + else + StringCopy(gStringVar3, gText_PokemonCenter); + } + + StringExpandPlaceholders(gStringVar4, sUsedFieldMoveTexts[r5[0]]); + return (const u16 *)(r5 + 2); +} + +static u16 *BufferQuestLogData_BoughtItem(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_BOUGHT_ITEM, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[2]; + a0[1] = eventData[3]; + a0[2] = *((const u32 *)eventData) >> 16; + a0[3] = *((const u32 *)eventData); + *((u8 *)a0 + 8) = *((const u8 *)eventData + 8); + *((u8 *)a0 + 9) = 1; + return a0 + 5; +} + +static const u16 *BufferQuestLogText_BoughtItem(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_BOUGHT_ITEM, eventData); + const u8 *r7 = (const u8 *)r4 + 8; + u32 r6 = (r4[2] << 16) + r4[3]; + DynamicPlaceholderTextUtil_Reset(); + GetMapNameGeneric(gStringVar1, r7[0]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0])); + if (r4[1] < 2) + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItem); + else + { + ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItemsIncludingItem); + } + return (const u16 *)(r7 + 2); +} + +static u16 *BufferQuestLogData_SoldItem(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_SOLD_ITEM, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[2]; + a0[1] = eventData[3]; + a0[2] = *((const u32 *)eventData) >> 16; + a0[3] = *((const u32 *)eventData); + *((u8 *)a0 + 8) = *((const u8 *)eventData + 8); + *((u8 *)a0 + 9) = *((const u8 *)eventData + 9); + return a0 + 5; +} + +static const u16 *BufferQuestLogText_SoldItem(const u16 *eventData) +{ + const u16 *r5 = sub_8113E88(QL_EVENT_SOLD_ITEM, eventData); + const u8 *r7 = (const u8 *) r5 + 8; + u32 r6 = (r5[2] << 16) + r5[3]; + DynamicPlaceholderTextUtil_Reset(); + GetMapNameGeneric(gStringVar1, r7[0]); + if (r7[1] == 0) { + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0])); + if (r5[1] == 1) + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gText_QuestLog_JustOne); + else + { + ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gText_QuestLog_Num); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); + } + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldNumOfItem); + } + else + { + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0])); + ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldItemsIncludingItem); + } + return (const u16 *)(r7 + 2); +} + +static u16 *BufferQuestLogData_ObtainedItem(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_OBTAINED_ITEM, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + *((u8 *)a0 + 2) = *((const u8 *)eventData + 2); + return a0 + 2; +} + +static const u16 *BufferQuestLogText_ObtainedItem(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_OBTAINED_ITEM, eventData); + const u8 *r5 = (const u8 *)r4 + 2; + GetMapNameGeneric(gStringVar1, r5[0]); + StringCopy(gStringVar2, ItemId_GetName(r4[0])); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_ObtainedItemInLocation); + return (const u16 *)(r5 + 2); +} + +static const u16 sQuestLogWorldMapFlags[] = + { + FLAG_WORLD_MAP_VIRIDIAN_CITY, + FLAG_WORLD_MAP_PEWTER_CITY, + FLAG_WORLD_MAP_CERULEAN_CITY, + FLAG_WORLD_MAP_LAVENDER_TOWN, + FLAG_WORLD_MAP_VERMILION_CITY, + FLAG_WORLD_MAP_CELADON_CITY, + FLAG_WORLD_MAP_FUCHSIA_CITY, + FLAG_WORLD_MAP_CINNABAR_ISLAND, + FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR, + FLAG_WORLD_MAP_SAFFRON_CITY, + FLAG_WORLD_MAP_ONE_ISLAND, + FLAG_WORLD_MAP_TWO_ISLAND, + FLAG_WORLD_MAP_THREE_ISLAND, + FLAG_WORLD_MAP_FOUR_ISLAND, + FLAG_WORLD_MAP_FIVE_ISLAND, + FLAG_WORLD_MAP_SEVEN_ISLAND, + FLAG_WORLD_MAP_SIX_ISLAND + }; + +void QuestLog_RecordEnteredMap(u16 worldMapFlag) +{ + s32 i; + + if (QL_IS_PLAYBACK_STATE) + return; + + for (i = 0; i < (int)NELEMS(sQuestLogWorldMapFlags); i++) + { + if (worldMapFlag == sQuestLogWorldMapFlags[i]) + { + if (!FlagGet(worldMapFlag)) + { + sNewlyEnteredMap = TRUE; + break; + } + else + { + sNewlyEnteredMap += 0; + sNewlyEnteredMap = FALSE; + break; + } + } + } +} + +void sub_8115798(void) +{ + u16 sp0; + if (!QL_IS_PLAYBACK_STATE) + { + if (sNewlyEnteredMap) + { + sp0 = gMapHeader.regionMapSectionId; + SetQuestLogEvent(QL_EVENT_ARRIVED, &sp0); + sNewlyEnteredMap = FALSE; + } + } +} + +static u16 *BufferQuestLogData_ArrivedInLocation(u16 *a0, const u16 *eventData) +{ + a0 = sub_8113DE0(QL_EVENT_ARRIVED, a0); + if (a0 == NULL) + return NULL; + a0[0] = eventData[0]; + return a0 + 1; +} + +static const u16 *BufferQuestLogText_ArrivedInLocation(const u16 *eventData) +{ + const u16 *r4 = sub_8113E88(QL_EVENT_ARRIVED, eventData); + GetMapNameGeneric(gStringVar1, (u8)r4[0]); + StringExpandPlaceholders(gStringVar4, gText_QuestLog_ArrivedInLocation); + return r4 + 1; +} + +static void BufferLinkPartnersName(u8 *dest) +{ + s32 i; + if (*dest++ == EXT_CTRL_CODE_BEGIN && *dest++ == EXT_CTRL_CODE_JPN) + { + for (i = 0; i < 5; i++) + { + if (*dest == EXT_CTRL_CODE_BEGIN) + break; + dest++; + } + *dest++ = EXT_CTRL_CODE_BEGIN; + *dest++ = EXT_CTRL_CODE_ENG; + *dest++ = EOS; + } +} diff --git a/src/start_menu.c b/src/start_menu.c index a7a59dab0..bac1c886f 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -8,6 +8,7 @@ #include "party_menu.h" #include "save.h" #include "link_rfu.h" +#include "help_message.h" #include "event_data.h" #include "fieldmap.h" #include "safari_zone.h" diff --git a/src/trainer_fan_club.c b/src/trainer_fan_club.c new file mode 100644 index 000000000..9040d3405 --- /dev/null +++ b/src/trainer_fan_club.c @@ -0,0 +1,359 @@ +#include "global.h" +#include "gflib.h" +#include "battle.h" +#include "event_data.h" +#include "event_scripts.h" +#include "random.h" +#include "constants/vars.h" +#include "constants/flags.h" + +struct TrainerFanClub +{ + u8 timer:7; + u8 gotInitialFans:1; + u8 fanFlags; +}; + +#define TRAINER_FAN_CLUB ((struct TrainerFanClub *)GetVarPointer(VAR_FANCLUB_FAN_COUNTER)) + +#define GET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags >> (flag) & 1) +#define SET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags |= 1 << (flag)) +#define FLIP_TRAINER_FAN_CLUB_FLAG(flag)(fanClub->fanFlags ^= 1 << (flag)) + +#define FANCLUB_MEMBER1 0 +#define FANCLUB_MEMBER2 1 +#define FANCLUB_MEMBER3 2 +#define FANCLUB_MEMBER4 3 +#define FANCLUB_MEMBER5 4 +#define FANCLUB_MEMBER6 5 +#define FANCLUB_MEMBER7 6 +#define FANCLUB_MEMBER8 7 + +#define NUM_TRAINER_FAN_CLUB_MEMBERS 8 + +static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *); +static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *); +static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *); +static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *); +static void TryLoseFansFromPlayTime(struct TrainerFanClub *); +static bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *); +static void SetInitialFansOfPlayer(struct TrainerFanClub *); +static void BufferFanClubTrainerName(struct LinkBattleRecords *, u8, u8); +static void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *); +static bool8 DidPlayerGetFirstFans(struct TrainerFanClub * ); +static void SetPlayerGotFirstFans(struct TrainerFanClub *); + +void ResetTrainerFanClub(void) +{ + VarSet(VAR_FANCLUB_FAN_COUNTER, 0); + VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, 0); +} + +void Script_TryLoseFansFromPlayTimeAfterLinkBattle(void) +{ + TryLoseFansFromPlayTimeAfterLinkBattle(TRAINER_FAN_CLUB); +} + +static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *fanClub) +{ + if (DidPlayerGetFirstFans(fanClub)) + { + TryLoseFansFromPlayTime(fanClub); + VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); + } +} + +void Script_UpdateTrainerFanClubGameClear(void) +{ + UpdateTrainerFanClubGameClear(TRAINER_FAN_CLUB); +} + +static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *fanClub) +{ + if (!fanClub->gotInitialFans) + { + SetPlayerGotFirstFans(fanClub); + SetInitialFansOfPlayer(fanClub); + VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); + FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BLACKBELT); + FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_ROCKER); + FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_WOMAN); + FlagClear(FLAG_HIDE_SAFFRON_FAN_CLUB_BEAUTY); + VarSet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB, 1); + } +} + +ALIGNED(4) const u8 sCounterIncrements[] = {2, 1, 2, 1}; + +static u8 TryGainNewFanFromCounter(struct TrainerFanClub *fanClub, u8 a1) +{ + if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) + { + if (fanClub->timer + sCounterIncrements[a1] >= 20) + { + if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 3) + { + PlayerGainRandomTrainerFan(fanClub); + fanClub->timer = 0; + } + else + fanClub->timer = 20; + } + else + fanClub->timer += sCounterIncrements[a1]; + } + + return fanClub->timer; +} + + +static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *fanClub) +{ + static const u8 sFanClubMemberIds[] = { + FANCLUB_MEMBER2, + FANCLUB_MEMBER4, + FANCLUB_MEMBER6, + FANCLUB_MEMBER1, + FANCLUB_MEMBER8, + FANCLUB_MEMBER7, + FANCLUB_MEMBER5, + FANCLUB_MEMBER3 + }; + + u8 i; + u8 idx = 0; + + for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) + { + if (!(GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]))) + { + idx = i; + if (Random() % 2) + { + SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); + return sFanClubMemberIds[i]; + } + } + } + + SET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); + return sFanClubMemberIds[idx]; +} + +static u8 PlayerLoseRandomTrainerFan(struct TrainerFanClub *fanClub) +{ + static const u8 sFanClubMemberIds[] = + { + FANCLUB_MEMBER6, + FANCLUB_MEMBER7, + FANCLUB_MEMBER4, + FANCLUB_MEMBER8, + FANCLUB_MEMBER5, + FANCLUB_MEMBER2, + FANCLUB_MEMBER1, + FANCLUB_MEMBER3 + }; + + u8 i; + u8 idx = 0; + + if (GetNumFansOfPlayerInTrainerFanClub(fanClub) == 1) + return 0; + + for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) + { + if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i])) + { + idx = i; + if (Random() % 2) + { + FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[i]); + return sFanClubMemberIds[i]; + } + } + } + + if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx])) + FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]); + + return sFanClubMemberIds[idx]; +} + +u16 Script_GetNumFansOfPlayerInTrainerFanClub(void) +{ + return GetNumFansOfPlayerInTrainerFanClub(TRAINER_FAN_CLUB); +} + +static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *fanClub) +{ + u8 count = 0; + u8 i; + + for (i = 0; i < NUM_TRAINER_FAN_CLUB_MEMBERS; i++) + { + if (GET_TRAINER_FAN_CLUB_FLAG(i)) + count++; + } + + return count; +} + +void Script_TryLoseFansFromPlayTime(void) +{ + TryLoseFansFromPlayTime(TRAINER_FAN_CLUB); +} + +static void TryLoseFansFromPlayTime(struct TrainerFanClub *fanClub) +{ + u8 i = 0; + u16 timer; + + if (gSaveBlock2Ptr->playTimeHours < 999) + { + while (1) + { + if (GetNumFansOfPlayerInTrainerFanClub(fanClub) < 5) + { + VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, gSaveBlock2Ptr->playTimeHours); + break; + } + if (i == NUM_TRAINER_FAN_CLUB_MEMBERS) + break; + + timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); + if (gSaveBlock2Ptr->playTimeHours - timer < 12) + break; + + PlayerLoseRandomTrainerFan(fanClub); + timer = VarGet(VAR_FANCLUB_LOSE_FAN_TIMER); + VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, timer + 12); + i++; + } + } +} + +bool16 Script_IsFanClubMemberFanOfPlayer(void) +{ + return IsFanClubMemberFanOfPlayer(TRAINER_FAN_CLUB); +} + +static bool16 IsFanClubMemberFanOfPlayer(struct TrainerFanClub *fanClub) +{ + return GET_TRAINER_FAN_CLUB_FLAG(gSpecialVar_0x8004); +} + +static void SetInitialFansOfPlayer(struct TrainerFanClub *fanClub) +{ + SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER1); + SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER2); + SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER3); +} + +void Script_BufferFanClubTrainerName(void) +{ + u8 whichLinkTrainer = 0; + u8 whichNPCTrainer = 0; + + switch (gSpecialVar_0x8004) + { + case FANCLUB_MEMBER1: + whichNPCTrainer = 0; + whichLinkTrainer = 0; + break; + case FANCLUB_MEMBER2: + case FANCLUB_MEMBER3: + case FANCLUB_MEMBER4: + case FANCLUB_MEMBER8: + break; + case FANCLUB_MEMBER5: + whichNPCTrainer = 1; + whichLinkTrainer = 0; + break; + case FANCLUB_MEMBER6: + whichNPCTrainer = 0; + whichLinkTrainer = 1; + break; + case FANCLUB_MEMBER7: + whichNPCTrainer = 2; + whichLinkTrainer = 1; + break; + } + BufferFanClubTrainerName(&gSaveBlock2Ptr->linkBattleRecords, whichLinkTrainer, whichNPCTrainer); +} + +static void BufferFanClubTrainerName(struct LinkBattleRecords *linkRecords, u8 whichLinkTrainer, u8 whichNPCTrainer) +{ + u8 *str; + const u8 *linkTrainerName = linkRecords->entries[whichLinkTrainer].name; + if (linkTrainerName[0] == EOS) + { + switch (whichNPCTrainer) + { + case 0: + StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); + break; + case 1: + StringCopy(gStringVar1, gText_LtSurge); + break; + case 2: + StringCopy(gStringVar1, gText_Koga); + break; + default: + StringCopy(gStringVar1, gSaveBlock1Ptr->rivalName); + break; + } + } + else + { + str = gStringVar1; + StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH); + str[PLAYER_NAME_LENGTH] = EOS; + if ( str[0] == EXT_CTRL_CODE_BEGIN + && str[1] == EXT_CTRL_CODE_JPN) + { + str += 2; + while (*str != EOS) + str++; + *str++ = EXT_CTRL_CODE_BEGIN; + *str++ = EXT_CTRL_CODE_ENG; + *str++ = EOS; + } + } +} + +void Special_UpdateTrainerFansAfterLinkBattle(void) +{ + UpdateTrainerFansAfterLinkBattle(TRAINER_FAN_CLUB); +} + +static void UpdateTrainerFansAfterLinkBattle(struct TrainerFanClub *fanClub) +{ + if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2) + { + TryLoseFansFromPlayTimeAfterLinkBattle(fanClub); + if (gBattleOutcome == B_OUTCOME_WON) + PlayerGainRandomTrainerFan(fanClub); + else + PlayerLoseRandomTrainerFan(fanClub); + } +} + +static bool8 DidPlayerGetFirstFans(struct TrainerFanClub *fanClub) +{ + return fanClub->gotInitialFans; +} + +void Script_SetPlayerGotFirstFans(void) +{ + SetPlayerGotFirstFans(TRAINER_FAN_CLUB); +} + +static void SetPlayerGotFirstFans(struct TrainerFanClub *fanClub) +{ + fanClub->gotInitialFans = TRUE; +} + +u8 Script_TryGainNewFanFromCounter(void) +{ + return TryGainNewFanFromCounter(TRAINER_FAN_CLUB, gSpecialVar_0x8004); +} |