diff options
Diffstat (limited to 'src/quest_log_events.c')
-rw-r--r-- | src/quest_log_events.c | 2155 |
1 files changed, 2155 insertions, 0 deletions
diff --git a/src/quest_log_events.c b/src/quest_log_events.c new file mode 100644 index 000000000..1f01e731c --- /dev/null +++ b/src/quest_log_events.c @@ -0,0 +1,2155 @@ +#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" + +struct DeferredLinkEvent +{ + u16 id; + u16 ALIGNED(4) data[14]; +}; + +static EWRAM_DATA struct DeferredLinkEvent sDeferredEvent = {0}; +EWRAM_DATA struct UnkStruct_203B044 gUnknown_203B044 = {0}; +static EWRAM_DATA u8 sEventShouldNotRecordSteps = 0; +static EWRAM_DATA bool8 sNewlyEnteredMap = FALSE; +static EWRAM_DATA u8 sLastDepartedMap = 0; +static EWRAM_DATA bool8 sPlayedTheSlots = FALSE; + +static bool8 InQuestLogDisabledLocation(void); +static bool8 ShouldRegisterEvent_HandlePartyActions(u16, const u16 *); +static bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16, const u16 *); +static u16 *ShouldRegisterEvent(u16, const u16 *); +static bool8 TrySetLinkQuestLogEvent(u16, const u16 *); +static bool8 TrySetTrainerBattleQuestLogEvent(u16, const u16 *); +static bool8 IsQuestLogEventWithSpecialEncounterSpecies(u16, const u16 *); +static void SetQuestLogEventToActive(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 ShouldRegisterEvent_HandleDeparted(u16, const u16 *); +static bool8 ShouldRegisterEvent_HandleGameCorner(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 && sEventShouldNotRecordSteps == 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 (ShouldRegisterEvent_HandleGameCorner(eventId, eventData) == FALSE) + return; + + if (gQuestLogPlaybackState == 0) + { + if (ShouldRegisterEvent_HandlePartyActions(eventId, eventData) == TRUE) + return; + + if (eventId != QL_EVENT_DEFEATED_WILD_MON || gUnknown_203AE04 == NULL) + { + if (ShouldRegisterEvent_HandleDeparted(eventId, eventData) == FALSE) + return; + StartRecordingQuestLogEntry(eventId); + } + } + else if (eventId == QL_EVENT_OBTAINED_ITEM) + return; + + SetQuestLogEventToActive(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 = ShouldRegisterEvent(eventId, eventData); + if (r1 == NULL) + return; + } + + sEventRecordingPointer = r1; + if (sEventShouldNotRecordSteps == 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 ShouldRegisterEvent_HandlePartyActions(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 || ShouldRegisterEvent_HandleBeatStoryTrainer(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 ShouldRegisterEvent_HandleBeatStoryTrainer(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) +{ + sEventShouldNotRecordSteps = 0; +} + +static u16 *ShouldRegisterEvent(u16 eventId, const u16 *eventData) +{ + if (ShouldRegisterEvent_HandlePartyActions(eventId, eventData) == TRUE) + return NULL; + + if (ShouldRegisterEvent_HandleDeparted(eventId, eventData) == FALSE) + return NULL; + + StartRecordingQuestLogEntry(eventId); + SetQuestLogEventToActive(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; + + ResetDeferredLinkEvent(); + sDeferredEvent.id = 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(sDeferredEvent.data, eventData, 12); + else + memcpy(sDeferredEvent.data, eventData, 24); + } + return TRUE; +} + +void ResetDeferredLinkEvent(void) +{ + sDeferredEvent = (struct DeferredLinkEvent){}; +} + +void QuestLog_StartRecordingInputsAfterDeferredEvent(void) +{ + if (sDeferredEvent.id != QL_EVENT_0) + { + u16 *resp; + sLastDepartedMap = 0; + StartRecordingQuestLogEntry(sDeferredEvent.id); + resp = sQuestLogStorageCBs[sDeferredEvent.id](sEventRecordingPointer, sDeferredEvent.data); + sEventRecordingPointer = resp; + ResetDeferredLinkEvent(); + } +} + +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; + + ResetDeferredLinkEvent(); + if (gQuestLogPlaybackState != 0 || FlagGet(FLAG_SYS_GAME_CLEAR) || ShouldRegisterEvent_HandleBeatStoryTrainer(eventId, eventData) != TRUE) + { + sDeferredEvent.id = eventId; + memcpy(sDeferredEvent.data, eventData, 8); + } + return TRUE; +} + +void sub_81139BC(void) +{ + if (sDeferredEvent.id != QL_EVENT_0) + { + u16 *resp; + if (gQuestLogPlaybackState == 0) + { + sLastDepartedMap = 0; + StartRecordingQuestLogEntry(sDeferredEvent.id); + } + SetQuestLogEventToActive(sDeferredEvent.id); + resp = sQuestLogStorageCBs[sDeferredEvent.id](sEventRecordingPointer, sDeferredEvent.data); + sEventRecordingPointer = resp; + TryRecordEvent41_IncCursor(1); + ResetDeferredLinkEvent(); + 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) + sLastDepartedMap = 0; + else + sLastDepartedMap = 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.id = 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.id](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 SetQuestLogEventToActive(u16 eventId) +{ + if (gUnknown_203B044.id != (u8)eventId || gUnknown_203B044.unk_2 != sQuestLogCursor) + { + gUnknown_203B044.id = 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; + sLastDepartedMap = 0; + sPlayedTheSlots = 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) + sEventShouldNotRecordSteps = 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.id == 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) +{ + sEventShouldNotRecordSteps = 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) +{ + sEventShouldNotRecordSteps = 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] = QL_EVENT_DEFEATED_CHAMPION | (2 << 12); + a0[1] = sQuestLogCursor; + a0[2] = eventData[1]; + a0[3] = eventData[2]; + *((u8 *)a0 + 8) = *((const u8 *)eventData + 6); + sEventShouldNotRecordSteps = 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) +{ + sEventShouldNotRecordSteps = 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) + sEventShouldNotRecordSteps = 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 SetQLPlayedTheSlots(void) +{ + sPlayedTheSlots = TRUE; +} + +static bool8 ShouldRegisterEvent_HandleDeparted(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEPARTED) + { + sLastDepartedMap = 0; + return TRUE; + } + if (sLastDepartedMap == *((u8 *)eventData + 1) + 1) + return FALSE; + sLastDepartedMap = *((u8 *)eventData + 1) + 1; + return TRUE; +} + +static bool8 ShouldRegisterEvent_HandleGameCorner(u16 eventId, const u16 *eventData) +{ + if (eventId != QL_EVENT_DEPARTED) + return TRUE; + + // Bug: should be QL_LOCATION_GAME_CORNER + 1 + if (*((u8 *)eventData + 1) == QL_LOCATION_GAME_CORNER && !sPlayedTheSlots) + return FALSE; + + sPlayedTheSlots = 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) + sEventShouldNotRecordSteps = 2; + else + sEventShouldNotRecordSteps = 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; + } +} |