Merge pull request #638 from GriffinRichards/doc-ql

Document some quest log
This commit is contained in:
GriffinR
2023-08-31 11:13:49 -04:00
committed by GitHub
48 changed files with 2953 additions and 2681 deletions
+1 -1
View File
@@ -1 +1 @@
gInputToStoreInQuestLogMaybe gFieldInputRecord
+2 -2
View File
@@ -1,4 +1,4 @@
gQuestLogPlaybackState gQuestLogPlaybackState
sNumEventsInLogEntry sMaxActionsInScene
gQuestLogFieldInput gQuestLogFieldInput
sCurQuestLogEntry sCurSceneActions
+1
View File
@@ -36,6 +36,7 @@
#include "constants/easy_chat.h" #include "constants/easy_chat.h"
#include "constants/trainer_card.h" #include "constants/trainer_card.h"
#include "constants/help_system.h" #include "constants/help_system.h"
#include "constants/trainer_fan_club.h"
#include "constants/mystery_gift.h" #include "constants/mystery_gift.h"
.include "asm/macros.inc" .include "asm/macros.inc"
.include "asm/macros/event.inc" .include "asm/macros/event.inc"
Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

-1
View File
@@ -1 +0,0 @@
换换烫烫烫烫换换
+1 -1
View File
@@ -449,7 +449,7 @@ struct BattleStruct
u16 castformPalette[MAX_BATTLERS_COUNT][16]; u16 castformPalette[MAX_BATTLERS_COUNT][16];
u8 wishPerishSongState; u8 wishPerishSongState;
u8 wishPerishSongBattlerId; u8 wishPerishSongBattlerId;
u8 field_182; u8 lastAttackerToFaintOpponent;
// align 4 // align 4
union { union {
struct LinkBattlerHeader linkBattlerHeader; struct LinkBattlerHeader linkBattlerHeader;
+19 -18
View File
@@ -5,6 +5,12 @@
#define QL_STATE_PLAYBACK 2 #define QL_STATE_PLAYBACK 2
#define QL_STATE_PLAYBACK_LAST 3 #define QL_STATE_PLAYBACK_LAST 3
#define QL_PLAYBACK_STATE_STOPPED 0
#define QL_PLAYBACK_STATE_RUNNING 1
#define QL_PLAYBACK_STATE_RECORDING 2
#define QL_PLAYBACK_STATE_ACTION_END 3
#define QL_PLAYBACK_STATE_RECORDING_NO_DELAY 4
#define QL_START_NORMAL 1 #define QL_START_NORMAL 1
#define QL_START_WARP 2 #define QL_START_WARP 2
@@ -16,9 +22,9 @@
#define QL_IS_PLAYBACK_STATE (gQuestLogState == QL_STATE_PLAYBACK || gQuestLogState == QL_STATE_PLAYBACK_LAST) #define QL_IS_PLAYBACK_STATE (gQuestLogState == QL_STATE_PLAYBACK || gQuestLogState == QL_STATE_PLAYBACK_LAST)
#define QL_EVENT_0 0 // Null #define QL_EVENT_INPUT 0 // Null
#define QL_EVENT_1 1 // Null #define QL_EVENT_GFX_CHANGE 1 // Null
#define QL_EVENT_2 2 // Null #define QL_EVENT_MOVEMENT 2 // Null
#define QL_EVENT_SWITCHED_PARTY_ORDER 3 #define QL_EVENT_SWITCHED_PARTY_ORDER 3
#define QL_EVENT_USED_ITEM 4 #define QL_EVENT_USED_ITEM 4
#define QL_EVENT_GAVE_HELD_ITEM 5 #define QL_EVENT_GAVE_HELD_ITEM 5
@@ -55,12 +61,12 @@
#define QL_EVENT_USED_FIELD_MOVE 36 #define QL_EVENT_USED_FIELD_MOVE 36
#define QL_EVENT_BOUGHT_ITEM 37 #define QL_EVENT_BOUGHT_ITEM 37
#define QL_EVENT_SOLD_ITEM 38 #define QL_EVENT_SOLD_ITEM 38
#define QL_EVENT_39 39 // Null #define QL_EVENT_SCENE_END 39 // Null
#define QL_EVENT_OBTAINED_ITEM 40 #define QL_EVENT_OBTAINED_STORY_ITEM 40
#define QL_EVENT_41 41 // Null #define QL_EVENT_WAIT 41 // Null
#define QL_EVENT_ARRIVED 42 #define QL_EVENT_ARRIVED 42
#define QL_EVENT_USED_POKEMART QL_EVENT_BOUGHT_ITEM - 1 // Used as a start pos for QL_EVENT_BOUGHT_ITEM / QL_EVENT_SOLD_ITEM #define QL_EVENT_USED_POKEMART (QL_EVENT_BOUGHT_ITEM - 1) // Used as a start pos for QL_EVENT_BOUGHT_ITEM / QL_EVENT_SOLD_ITEM
#define IS_LINK_QL_EVENT(event)((event) >= QL_EVENT_LINK_TRADED && (event) <= QL_EVENT_LINK_BATTLED_UNION) #define IS_LINK_QL_EVENT(event)((event) >= QL_EVENT_LINK_TRADED && (event) <= QL_EVENT_LINK_BATTLED_UNION)
#define IS_VALID_QL_EVENT(event)((event) >= QL_EVENT_SWITCHED_PARTY_ORDER && (event) <= QL_EVENT_ARRIVED) #define IS_VALID_QL_EVENT(event)((event) >= QL_EVENT_SWITCHED_PARTY_ORDER && (event) <= QL_EVENT_ARRIVED)
@@ -140,16 +146,11 @@
#define QL_INPUT_A 9 #define QL_INPUT_A 9
#define QL_INPUT_B 10 #define QL_INPUT_B 10
#define QL_ACTION_MOVEMENT 0
#define FANCLUB_MEMBER1 0 #define QL_ACTION_GFX_CHANGE 1
#define FANCLUB_MEMBER2 1 #define QL_ACTION_INPUT 2
#define FANCLUB_MEMBER3 2 #define QL_ACTION_EMPTY 3
#define FANCLUB_MEMBER4 3 #define QL_ACTION_WAIT 254
#define FANCLUB_MEMBER5 4 #define QL_ACTION_SCENE_END 255
#define FANCLUB_MEMBER6 5
#define FANCLUB_MEMBER7 6
#define FANCLUB_MEMBER8 7
#define NUM_TRAINER_FAN_CLUB_MEMBERS 8
#endif //GUARD_CONSTANTS_QUEST_LOG_H #endif //GUARD_CONSTANTS_QUEST_LOG_H
+15
View File
@@ -0,0 +1,15 @@
#ifndef GUARD_CONSTANTS_TRAINER_FAN_CLUB_H
#define GUARD_CONSTANTS_TRAINER_FAN_CLUB_H
#define FANCLUB_MEMBER1 0
#define FANCLUB_MEMBER2 1
#define FANCLUB_MEMBER3 2
#define FANCLUB_MEMBER4 3
#define FANCLUB_MEMBER5 4
#define FANCLUB_MEMBER6 5
#define FANCLUB_MEMBER7 6
#define FANCLUB_MEMBER8 7
#define NUM_TRAINER_FAN_CLUB_MEMBERS 8
#endif //GUARD_CONSTANTS_TRAINER_FAN_CLUB_H
+1 -1
View File
@@ -126,7 +126,7 @@ void MoveCoords(u8, s16 *, s16 *);
bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *); bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *);
u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *);
u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation); u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation);
void UpdateQuestLogObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *); void QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *);
bool8 ObjectEventSetHeldMovement(struct ObjectEvent *, u8); bool8 ObjectEventSetHeldMovement(struct ObjectEvent *, u8);
void ShiftStillObjectEventCoords(struct ObjectEvent *); void ShiftStillObjectEventCoords(struct ObjectEvent *);
void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *, u8); void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *, u8);
+1 -1
View File
@@ -21,7 +21,7 @@ struct FieldInput
u8 dpadDirection; u8 dpadDirection;
}; };
extern struct FieldInput gInputToStoreInQuestLogMaybe; extern struct FieldInput gFieldInputRecord;
void RestartWildEncounterImmunitySteps(void); void RestartWildEncounterImmunitySteps(void);
void ClearPoisonStepCounter(void); void ClearPoisonStepCounter(void);
+13 -14
View File
@@ -550,7 +550,7 @@ struct RecordMixingDayCareMail
bool16 holdsItem[DAYCARE_MON_COUNT]; bool16 holdsItem[DAYCARE_MON_COUNT];
}; };
struct QuestLogNPCData struct QuestLogObjectEventTemplate
{ {
u32 x:8; u32 x:8;
u32 negx:1; u32 negx:1;
@@ -579,12 +579,12 @@ struct QuestLogObjectEvent
/*0x01*/ u8 spriteAffineAnimPausedBackup:1; /*0x01*/ u8 spriteAffineAnimPausedBackup:1;
/*0x01*/ u8 disableJumpLandingGroundEffect:1; /*0x01*/ u8 disableJumpLandingGroundEffect:1;
/*0x02*/ u8 fixedPriority:1; /*0x02*/ u8 fixedPriority:1;
/*0x02*/ u8 mapobj_unk_18:4; /*0x02*/ u8 facingDirection:4;
/*0x02*/ u8 unused_02_5:3; /*0x02*/ u8 unused:3;
/*0x03*/ u8 mapobj_unk_0B_0:4; /*0x03*/ u8 currentElevation:4;
/*0x03*/ u8 elevation:4; /*0x03*/ u8 previousElevation:4;
/*0x04*/ u8 graphicsId; /*0x04*/ u8 graphicsId;
/*0x05*/ u8 animPattern; /*0x05*/ u8 movementType;
/*0x06*/ u8 trainerType; /*0x06*/ u8 trainerType;
/*0x07*/ u8 localId; /*0x07*/ u8 localId;
/*0x08*/ u8 mapNum; /*0x08*/ u8 mapNum;
@@ -597,21 +597,20 @@ struct QuestLogObjectEvent
/*0x11*/ u8 animId; /*0x11*/ u8 animId;
}; };
struct QuestLog // This represents all the data needed to display a single scene for the "Quest Log" when the player resumes playing.
//
struct QuestLogScene
{ {
/*0x0000*/ u8 startType; /*0x0000*/ u8 startType; // QL_START_NORMAL / QL_START_WARP
/*0x0001*/ u8 mapGroup; /*0x0001*/ u8 mapGroup;
/*0x0002*/ u8 mapNum; /*0x0002*/ u8 mapNum;
/*0x0003*/ u8 warpId; /*0x0003*/ u8 warpId;
/*0x0004*/ s16 x; /*0x0004*/ s16 x;
/*0x0006*/ s16 y; /*0x0006*/ s16 y;
/*0x0008*/ struct QuestLogObjectEvent unk_008[OBJECT_EVENTS_COUNT]; /*0x0008*/ struct QuestLogObjectEvent objectEvents[OBJECT_EVENTS_COUNT];
// These arrays hold the game state for
// playing back the quest log
/*0x0148*/ u8 flags[NUM_FLAG_BYTES]; /*0x0148*/ u8 flags[NUM_FLAG_BYTES];
/*0x02c8*/ u16 vars[VARS_COUNT]; /*0x02c8*/ u16 vars[VARS_COUNT];
/*0x0468*/ struct QuestLogNPCData npcData[64]; /*0x0468*/ struct QuestLogObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];
/*0x0568*/ u16 script[128]; /*0x0568*/ u16 script[128];
/*0x0668*/ u16 end[0]; /*0x0668*/ u16 end[0];
}; };
@@ -780,7 +779,7 @@ struct SaveBlock1
/*0x0EE0*/ u8 flags[NUM_FLAG_BYTES]; /*0x0EE0*/ u8 flags[NUM_FLAG_BYTES];
/*0x1000*/ u16 vars[VARS_COUNT]; /*0x1000*/ u16 vars[VARS_COUNT];
/*0x1200*/ u32 gameStats[NUM_GAME_STATS]; /*0x1200*/ u32 gameStats[NUM_GAME_STATS];
/*0x1300*/ struct QuestLog questLog[QUEST_LOG_SCENE_COUNT]; /*0x1300*/ struct QuestLogScene questLog[QUEST_LOG_SCENE_COUNT];
/*0x2CA0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT]; /*0x2CA0*/ u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2CAC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT]; /*0x2CAC*/ u16 easyChatBattleStart[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2CB8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT]; /*0x2CB8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT];
+2 -9
View File
@@ -3,6 +3,7 @@
#include "pokemon_storage_system.h" #include "pokemon_storage_system.h"
#include "mon_markings.h" #include "mon_markings.h"
#include "quest_log.h"
// The maximum number of Pokémon icons that can appear on-screen. // The maximum number of Pokémon icons that can appear on-screen.
// By default the limit is 40 (though in practice only 37 can be). // By default the limit is 40 (though in practice only 37 can be).
@@ -273,14 +274,6 @@ struct PokeStorageItemIcon
u8 active; u8 active;
}; };
struct PokeStorageQuestLogData
{
u16 species1;
u16 species2;
u8 box1;
u8 box2;
};
struct PokemonStorageSystemData struct PokemonStorageSystemData
{ {
u8 state; u8 state;
@@ -426,7 +419,7 @@ struct PokemonStorageSystemData
struct PokeStorageItemIcon itemIcons[MAX_ITEM_ICONS]; struct PokeStorageItemIcon itemIcons[MAX_ITEM_ICONS];
u16 movingItemId; u16 movingItemId;
u16 itemInfoWindowOffset; u16 itemInfoWindowOffset;
struct PokeStorageQuestLogData pokeStorageQuestLogData; struct QuestLogEvent_MovedBoxMon questLogData;
u16 unusedField2; u16 unusedField2;
u16 displayMonPalOffset; u16 displayMonPalOffset;
u16 *displayMonTilePtr; u16 *displayMonTilePtr;
+188 -49
View File
@@ -3,63 +3,202 @@
#include "global.h" #include "global.h"
#include "quest_log_battle.h" #include "quest_log_battle.h"
#include "constants/quest_log.h"
#include "field_control_avatar.h" #include "field_control_avatar.h"
#include "constants/quest_log.h"
#include "constants/battle.h"
// Layout of Quest Log script commands
#define QL_CMD_EVENT_MASK 0x0FFF
#define QL_CMD_COUNT_SHIFT 12
#define QL_CMD_COUNT_MASK (0xF << QL_CMD_COUNT_SHIFT)
// Parameter to QuestLog_OnEscalatorWarp // Parameter to QuestLog_OnEscalatorWarp
#define QL_ESCALATOR_OUT 1 #define QL_ESCALATOR_OUT 1
#define QL_ESCALATOR_IN 2 #define QL_ESCALATOR_IN 2
struct QuestLogEntry struct QuestLogAction
{ {
// When command == 2, these fields have different meanings union {
u8 localId; // cmd == 2: Pressed A/B, checked wild, held direction, took step struct {
u8 mapNum; // cmd == 2: Always set to 0 u8 localId;
u8 mapGroup; // cmd == 2: Dpad direction u8 mapNum;
u8 animId; // cmd == 2: Always set to 0 u8 mapGroup;
u8 movementActionId;
} a; // Data when type == 0
struct {
u8 localId;
u8 mapNum;
u8 mapGroup;
u8 gfxState;
} b; // Data when type == 1
u8 fieldInput[4]; // Data when type == 2
u8 raw[4];
} data;
u16 duration; u16 duration;
u8 command; u8 type;
}; };
struct UnkStruct_203B044 struct QuestLogRepeatEventTracker
{ {
u8 id; u8 id;
u8 unk_1; u8 numRepeats;
u16 unk_2; u16 counter;
};
// Event data structs
// QL_EVENT_SWITCHED_PARTY_ORDER
struct QuestLogEvent_SwitchedPartyOrder
{
u16 species1;
u16 species2;
};
// QL_EVENT_USED_ITEM
// QL_EVENT_GAVE_HELD_ITEM
// QL_EVENT_GAVE_HELD_ITEM_BAG
// QL_EVENT_GAVE_HELD_ITEM_PC
// QL_EVENT_TOOK_HELD_ITEM
// QL_EVENT_DEPOSITED_ITEM_PC
// QL_EVENT_WITHDREW_ITEM_PC
struct QuestLogEvent_Item
{
u16 itemId;
u16 unused;
u16 species;
u16 itemParam;
};
// QL_EVENT_SWAPPED_HELD_ITEM
// QL_EVENT_SWAPPED_HELD_ITEM_PC
struct QuestLogEvent_SwappedHeldItem
{
u16 takenItemId;
u16 givenItemId;
u16 species;
};
// QL_EVENT_LINK_TRADED
// QL_EVENT_LINK_TRADED_UNION
struct QuestLogEvent_Traded
{
u16 speciesSent;
u16 speciesReceived;
u8 partnerName[PLAYER_NAME_LENGTH];
};
// QL_EVENT_LINK_BATTLED_SINGLE
// QL_EVENT_LINK_BATTLED_DOUBLE
// QL_EVENT_LINK_BATTLED_MULTI
// QL_EVENT_LINK_BATTLED_UNION
struct QuestLogEvent_LinkBattle
{
u8 outcome;
u8 playerNames[MAX_BATTLERS_COUNT - 1][PLAYER_NAME_LENGTH];
};
// QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES
// QL_EVENT_SWITCHED_MONS_WITHIN_BOX
// QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON
// QL_EVENT_MOVED_MON_BETWEEN_BOXES
// QL_EVENT_MOVED_MON_WITHIN_BOX
// QL_EVENT_WITHDREW_MON_PC
// QL_EVENT_DEPOSITED_MON_PC
// QL_EVENT_SWITCHED_MULTIPLE_MONS
struct QuestLogEvent_MovedBoxMon
{
u16 species1;
u16 species2;
u8 box1;
u8 box2;
};
// QL_EVENT_DEFEATED_TRAINER
// QL_EVENT_DEFEATED_GYM_LEADER
// QL_EVENT_DEFEATED_E4_MEMBER
// QL_EVENT_DEFEATED_CHAMPION
struct QuestLogEvent_TrainerBattle
{
u16 trainerId;
u16 speciesOpponent;
u16 speciesPlayer;
u8 hpFractionId;
u8 mapSec;
};
// QL_EVENT_DEFEATED_WILD_MON
struct QuestLogEvent_WildBattle
{
u16 defeatedSpecies;
u16 caughtSpecies;
u8 mapSec;
};
// QL_EVENT_DEPARTED
struct QuestLogEvent_Departed
{
u8 mapSec;
u8 locationId;
};
// QL_EVENT_USED_FIELD_MOVE
struct QuestLogEvent_FieldMove
{
u16 species;
u8 fieldMove;
u8 mapSec;
};
// QL_EVENT_BOUGHT_ITEM
// QL_EVENT_SOLD_ITEM
struct QuestLogEvent_Shop
{
u32 totalMoney; // Total amount of money spent buying or earned selling
u16 lastItemId;
u16 itemQuantity; // Total number of items bought or sold
u8 mapSec;
bool8 hasMultipleTransactions;
u8 logEventId; // Either 0 (empty), 1 (bought) or 2 (sold)
};
// QL_EVENT_OBTAINED_STORY_ITEM
struct QuestLogEvent_StoryItem
{
u16 itemId;
u8 mapSec;
}; };
extern u8 gQuestLogState; extern u8 gQuestLogState;
extern u8 gQuestLogPlaybackState; extern u8 gQuestLogPlaybackState;
extern struct FieldInput gQuestLogFieldInput; extern struct FieldInput gQuestLogFieldInput;
extern struct UnkStruct_203B044 gUnknown_203B044; extern struct QuestLogRepeatEventTracker gQuestLogRepeatEventTracker;
extern u16 *gUnknown_203AE04; extern u16 *gQuestLogDefeatedWildMonRecord;
extern u16 *sEventRecordingPointer; extern u16 *gQuestLogRecordingPointer;
extern u16 sQuestLogCursor; extern u16 gQuestLogCurActionIdx;
void QuestLogRecordPlayerAvatarGfxTransition(u8); void QuestLogRecordPlayerAvatarGfxTransition(u8);
void SetQuestLogEvent(u16, const u16 *); void SetQuestLogEvent(u16, const u16 *);
void SetQLPlayedTheSlots(void); void SetQLPlayedTheSlots(void);
void QuestLog_RecordEnteredMap(u16); void QuestLog_RecordEnteredMap(u16);
u8 sub_8112CAC(void); u8 QL_GetPlaybackState(void);
bool8 QuestLog_SchedulePlaybackCB(void (*func)(void)); bool8 QL_AvoidDisplay(void (*func)(void));
void QuestLog_BackUpPalette(u16 offset, u16 size); void QuestLog_BackUpPalette(u16 offset, u16 size);
void CommitQuestLogWindow1(void); void CommitQuestLogWindow1(void);
void QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void); void QuestLog_DrawPreviouslyOnQuestHeaderIfInPlaybackMode(void);
void ResetQuestLog(void); void ResetQuestLog(void);
void ResetTrainerFanClub(void); void ResetTrainerFanClub(void);
void TrySetUpQuestLogScenes_ElseContinueFromSave(u8 taskId); void TryStartQuestLogPlayback(u8 taskId);
void SaveQuestLogData(void); void SaveQuestLogData(void);
void QuestLog_CutRecording(void); void QuestLog_CutRecording(void);
u8 sub_8112CAC(void);
void ResetDeferredLinkEvent(void); void ResetDeferredLinkEvent(void);
void FinishRecordingQuestLogScene(void); void QL_FinishRecordingScene(void);
void QuestLogEvents_HandleEndTrainerBattle(void); void QuestLogEvents_HandleEndTrainerBattle(void);
void *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx); void *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx);
void QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value); void QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value);
void SetQuestLogRecordAndPlaybackPointers(void *oldSave); void QL_AddASLROffset(void *oldSaveBlockPtr);
void sub_811246C(struct Sprite *sprite); void QL_UpdateObject(struct Sprite *sprite);
void QuestLogRecordNPCStep(u8 a0, u8 a1, u8 a2, u8 a3); void QuestLogRecordNPCStep(u8 a0, u8 a1, u8 a2, u8 a3);
bool8 sub_8111C2C(void); bool8 QL_IsTrainerSightDisabled(void);
void QuestLog_OnEscalatorWarp(u8 direction); void QuestLog_OnEscalatorWarp(u8 direction);
void QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 movementActionId, u8 duration); void QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 movementActionId, u8 duration);
void Special_UpdateTrainerFansAfterLinkBattle(void); void Special_UpdateTrainerFansAfterLinkBattle(void);
@@ -67,39 +206,39 @@ void QuestLogRecordPlayerStep(u8 movementActionId);
void QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration); void QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration);
void QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration); void QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration);
void QL_AfterRecordFishActionSuccessful(void); void QL_AfterRecordFishActionSuccessful(void);
void sub_8110920(void); void QL_ResetDefeatedWildMonRecord(void);
void sub_8111708(void); void QL_RestoreMapLayoutId(void);
void sub_81127F8(struct FieldInput * a0); void QL_RecordFieldInput(struct FieldInput * fieldInput);
void sub_8112B3C(void); void QL_TryRunActions(void);
void RunQuestLogCB(void); void RunQuestLogCB(void);
void sub_8111C68(void); void QL_HandleInput(void);
bool8 QuestLogScenePlaybackIsEnding(void); bool8 QuestLogScenePlaybackIsEnding(void);
void sub_8115798(void); void SetQuestLogEvent_Arrived(void);
bool8 QuestLog_ShouldEndSceneOnMapChange(void); bool8 QuestLog_ShouldEndSceneOnMapChange(void);
void QuestLog_AdvancePlayhead_(void); void QuestLog_AdvancePlayhead_(void);
void QuestLog_InitPalettesBackup(void); void QuestLog_InitPalettesBackup(void);
void sub_8110FCC(void); void QL_InitSceneObjectsAndActions(void);
u8 GetQuestLogStartType(void); u8 GetQuestLogStartType(void);
void sub_81113E4(void); void QL_CopySaveState(void);
void sub_8111438(void); void QL_ResetPartyAndPC(void);
void StartRecordingQuestLogEntry(u16 eventId); void QL_StartRecordingAction(u16 eventId);
bool8 WillCommandOfSizeFitInSav1Record(u16 *cursor, size_t size); bool8 QL_IsRoomToSaveAction(const void *cursor, size_t size);
bool8 sub_8110944(const void *a0, size_t cmdSize); bool8 QL_IsRoomToSaveEvent(const void *cursor, size_t size);
void sub_8113BD8(void); void QL_ResetEventStates(void);
void ResetUnk203B044(void); void QL_ResetRepeatEventTracker(void);
u16 *TryRecordEvent39_NoParams(u16 *); u16 *QL_RecordAction_SceneEnd(u16 *);
u16 *sub_8113C8C(u16 *, struct QuestLogEntry *); u16 *QL_LoadAction_Wait(u16 *, struct QuestLogAction *);
u16 *sub_8113CC8(u16 *, struct QuestLogEntry *); u16 *QL_RecordAction_Input(u16 *, struct QuestLogAction *);
u16 *sub_8113D08(u16 *, struct QuestLogEntry *); u16 *QL_LoadAction_Input(u16 *, struct QuestLogAction *);
u16 *sub_8113D48(u16 *, struct QuestLogEntry *); u16 *QL_RecordAction_MovementOrGfxChange(u16 *, struct QuestLogAction *);
u16 *sub_8113D94(u16 *, struct QuestLogEntry *); u16 *QL_LoadAction_MovementOrGfxChange(u16 *, struct QuestLogAction *);
void QL_EnableRecordingSteps(void); void QL_EnableRecordingSteps(void);
u16 *QuestLog_SkipCommand(u16 *, u16 **); u16 *QL_SkipCommand(u16 *, u16 **);
void sub_8113ABC(const u16 *); void QL_UpdateLastDepartedLocation(const u16 *);
u16 *sub_8113C20(u16 *, struct QuestLogEntry *); u16 *QL_LoadAction_SceneEnd(u16 *, struct QuestLogAction *);
bool8 sub_8113AE8(const u16 *); bool8 QL_LoadEvent(const u16 *);
bool8 sub_8113B44(const u16 *); bool8 QL_TryRepeatEvent(const u16 *);
void TryRecordEvent41_IncCursor(u16); void QL_RecordWait(u16);
#endif //GUARD_QUEST_LOG_H #endif //GUARD_QUEST_LOG_H
+3 -3
View File
@@ -3,8 +3,8 @@
#include "global.h" #include "global.h"
void SetQuestLogObjectEventsData(struct QuestLog *); void QL_RecordObjects(struct QuestLogScene *);
void SetSav1ObjectEventsFromQuestLog(struct QuestLog *, struct ObjectEventTemplate *); void QL_LoadObjects(struct QuestLogScene *, struct ObjectEventTemplate *);
void sub_815A540(void); void QL_TryStopSurfing(void);
#endif //GUARD_QUEST_LOG_OBJECTS_H #endif //GUARD_QUEST_LOG_OBJECTS_H
+13 -9
View File
@@ -3,15 +3,19 @@
#include "global.h" #include "global.h"
#define QL_PLAYER_GFX_NORMAL 0 enum {
#define QL_PLAYER_GFX_BIKE 1 QL_PLAYER_GFX_NORMAL,
#define QL_PLAYER_GFX_FISH 2 QL_PLAYER_GFX_BIKE,
#define QL_PLAYER_GFX_SURF 3 QL_PLAYER_GFX_FISH,
#define QL_PLAYER_GFX_STOP_SURF_S 4 QL_PLAYER_GFX_SURF,
#define QL_PLAYER_GFX_STOP_SURF_N 5 QL_PLAYER_GFX_STOP_SURF_S,
#define QL_PLAYER_GFX_STOP_SURF_W 6 QL_PLAYER_GFX_STOP_SURF_N,
#define QL_PLAYER_GFX_STOP_SURF_E 7 QL_PLAYER_GFX_STOP_SURF_W,
#define QL_PLAYER_GFX_VSSEEKER 8 QL_PLAYER_GFX_STOP_SURF_E,
QL_PLAYER_GFX_VSSEEKER,
QL_PLAYER_GFX_NONE = 0xFF
};
void QuestLogUpdatePlayerSprite(u8 state); void QuestLogUpdatePlayerSprite(u8 state);
bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state); bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state);
+1 -1
View File
@@ -14,7 +14,7 @@ bool8 CreatePCMenu(void);
void ScriptMenu_DisplayPCStartupPrompt(void); void ScriptMenu_DisplayPCStartupPrompt(void);
bool8 (*ScriptMenu_HidePokemonPic(void))(void); bool8 (*ScriptMenu_HidePokemonPic(void))(void);
void QLPlaybackCB_DestroyScriptMenuMonPicSprites(void); void QL_DestroyAbortedDisplay(void);
void PicboxCancel(void); void PicboxCancel(void);
#endif //GUARD_SCRIPT_MENU_H #endif //GUARD_SCRIPT_MENU_H
+1 -1
View File
@@ -10,7 +10,7 @@ void CreatePokemartMenu(const u16 *itemsForSale);
void CreateDecorationShop1Menu(const u16 *); void CreateDecorationShop1Menu(const u16 *);
void CreateDecorationShop2Menu(const u16 *); void CreateDecorationShop2Menu(const u16 *);
u8 GetMartFontId(void); u8 GetMartFontId(void);
void RecordItemPurchase(u16 a0, u16 a1, u8 a2); void RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId);
// buy_menu_helper // buy_menu_helper
void BuyMenuInitWindows(bool32 isSellingTM); void BuyMenuInitWindows(bool32 isSellingTM);
+1 -1
View File
@@ -2882,7 +2882,7 @@ static void Cmd_tryfaintmon(void)
if (gBattleResults.opponentFaintCounter < 255) if (gBattleResults.opponentFaintCounter < 255)
gBattleResults.opponentFaintCounter++; gBattleResults.opponentFaintCounter++;
gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
*(u8 *)(&gBattleStruct->field_182) = gBattlerAttacker; *(u8 *)(&gBattleStruct->lastAttackerToFaintOpponent) = gBattlerAttacker;
} }
if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0)
{ {
+2 -2
View File
@@ -807,13 +807,13 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
SetMapVarsToTrainer(); SetMapVarsToTrainer();
return EventScript_TryDoDoubleTrainerBattle; return EventScript_TryDoDoubleTrainerBattle;
case TRAINER_BATTLE_REMATCH_DOUBLE: case TRAINER_BATTLE_REMATCH_DOUBLE:
FinishRecordingQuestLogScene(); QL_FinishRecordingScene();
TrainerBattleLoadArgs(sDoubleBattleParams, data); TrainerBattleLoadArgs(sDoubleBattleParams, data);
SetMapVarsToTrainer(); SetMapVarsToTrainer();
gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);
return EventScript_TryDoDoubleRematchBattle; return EventScript_TryDoDoubleRematchBattle;
case TRAINER_BATTLE_REMATCH: case TRAINER_BATTLE_REMATCH:
FinishRecordingQuestLogScene(); QL_FinishRecordingScene();
TrainerBattleLoadArgs(sOrdinaryBattleParams, data); TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
SetMapVarsToTrainer(); SetMapVarsToTrainer();
gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);
+2 -1
View File
@@ -29,6 +29,7 @@
#include "pokemon_storage_system.h" #include "pokemon_storage_system.h"
#include "constants/items.h" #include "constants/items.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/quest_log.h"
struct BerryPouchStruct_203F36C struct BerryPouchStruct_203F36C
{ {
@@ -1384,7 +1385,7 @@ static void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId)
PlaySE(SE_SHOP); PlaySE(SE_SHOP);
RemoveBagItem(gSpecialVar_ItemId, data[8]); RemoveBagItem(gSpecialVar_ItemId, data[8]);
AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]);
RecordItemPurchase(gSpecialVar_ItemId, data[8], 2); RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);
DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow);
SortAndCountBerries(); SortAndCountBerries();
SanitizeListMenuSelectionParams(); SanitizeListMenuSelectionParams();
+3 -3
View File
@@ -114,15 +114,15 @@ void DisplayBerryPowderVendorMenu(void)
{ {
struct WindowTemplate template; struct WindowTemplate template;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE) if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
{ return;
template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32); template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);
sBerryPowderVendorWindowId = AddWindow(&template); sBerryPowderVendorWindowId = AddWindow(&template);
FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0); FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0);
PutWindowTilemap(sBerryPowderVendorWindowId); PutWindowTilemap(sBerryPowderVendorWindowId);
LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13)); LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13));
DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder()); DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder());
}
} }
void RemoveBerryPowderVendorMenu(void) void RemoveBerryPowderVendorMenu(void)
+7 -7
View File
@@ -192,15 +192,15 @@ u16 *GetVarPointer(u16 idx)
{ {
switch (gQuestLogPlaybackState) switch (gQuestLogPlaybackState)
{ {
case 0: case QL_PLAYBACK_STATE_STOPPED:
default: default:
break; break;
case 1: case QL_PLAYBACK_STATE_RUNNING:
ptr = QuestLogGetFlagOrVarPtr(FALSE, idx); ptr = QuestLogGetFlagOrVarPtr(FALSE, idx);
if (ptr != NULL) if (ptr != NULL)
gSaveBlock1Ptr->vars[idx - VARS_START] = *ptr; gSaveBlock1Ptr->vars[idx - VARS_START] = *ptr;
break; break;
case 2: case QL_PLAYBACK_STATE_RECORDING:
if (IsFlagOrVarStoredInQuestLog(idx - VARS_START, TRUE) == TRUE) if (IsFlagOrVarStoredInQuestLog(idx - VARS_START, TRUE) == TRUE)
{ {
gLastQuestLogStoredFlagOrVarIdx = idx - VARS_START; gLastQuestLogStoredFlagOrVarIdx = idx - VARS_START;
@@ -263,15 +263,15 @@ u8 *GetFlagAddr(u16 idx)
{ {
switch (gQuestLogPlaybackState) switch (gQuestLogPlaybackState)
{ {
case 0: case QL_PLAYBACK_STATE_STOPPED:
default: default:
break; break;
case 1: case QL_PLAYBACK_STATE_RUNNING:
ptr = QuestLogGetFlagOrVarPtr(TRUE, idx); ptr = QuestLogGetFlagOrVarPtr(TRUE, idx);
if (ptr != NULL) if (ptr != NULL)
gSaveBlock1Ptr->flags[idx >> 3] = *ptr; gSaveBlock1Ptr->flags[idx / 8] = *ptr;
break; break;
case 2: case QL_PLAYBACK_STATE_RECORDING:
if (IsFlagOrVarStoredInQuestLog(idx, FALSE) == TRUE) if (IsFlagOrVarStoredInQuestLog(idx, FALSE) == TRUE)
{ {
gLastQuestLogStoredFlagOrVarIdx = idx; gLastQuestLogStoredFlagOrVarIdx = idx;
+8 -10
View File
@@ -1677,8 +1677,8 @@ void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(str
do do
{ {
if (ScriptContext_IsEnabled() != TRUE && sub_8112CAC() == 1) if (ScriptContext_IsEnabled() != TRUE && QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING)
spriteTemplate->callback = sub_811246C; spriteTemplate->callback = QL_UpdateObject;
else else
spriteTemplate->callback = callback; spriteTemplate->callback = callback;
} while (0); } while (0);
@@ -5046,7 +5046,7 @@ bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent)
bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId)
{ {
if(sub_8112CAC() == TRUE) if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING)
ObjectEventClearHeldMovementIfActive(objectEvent); ObjectEventClearHeldMovementIfActive(objectEvent);
else if (ObjectEventIsMovementOverridden(objectEvent)) else if (ObjectEventIsMovementOverridden(objectEvent))
return TRUE; return TRUE;
@@ -5122,7 +5122,7 @@ void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sp
ObjectEventUpdateSubpriority(objectEvent, sprite); ObjectEventUpdateSubpriority(objectEvent, sprite);
} }
void UpdateQuestLogObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) void QL_UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
DoGroundEffects_OnSpawn(objectEvent, sprite); DoGroundEffects_OnSpawn(objectEvent, sprite);
TryEnableObjectEventAnim(objectEvent, sprite); TryEnableObjectEventAnim(objectEvent, sprite);
@@ -5262,15 +5262,13 @@ static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent
return FALSE; return FALSE;
} }
static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animId) static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 movementActionId)
{ {
objectEvent->movementActionId = animId; objectEvent->movementActionId = movementActionId;
sprite->data[2] = 0; sprite->data[2] = 0;
if (gQuestLogPlaybackState == 2) if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)
{ QuestLogRecordNPCStep(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementActionId);
QuestLogRecordNPCStep(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, animId);
}
} }
static void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) static void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction)
+12 -12
View File
@@ -71,7 +71,7 @@ static bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8
static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);
static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z);
struct FieldInput gInputToStoreInQuestLogMaybe; struct FieldInput gFieldInputRecord;
void FieldClearPlayerInput(struct FieldInput *input) void FieldClearPlayerInput(struct FieldInput *input)
{ {
@@ -203,8 +203,8 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
metatileAttributes = MapGridGetMetatileAttributeAt(position.x, position.y, METATILE_ATTRIBUTES_ALL); metatileAttributes = MapGridGetMetatileAttributeAt(position.x, position.y, METATILE_ATTRIBUTES_ALL);
metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
FieldClearPlayerInput(&gInputToStoreInQuestLogMaybe); FieldClearPlayerInput(&gFieldInputRecord);
gInputToStoreInQuestLogMaybe.dpadDirection = input->dpadDirection; gFieldInputRecord.dpadDirection = input->dpadDirection;
if (CheckForTrainersWantingBattle() == TRUE) if (CheckForTrainersWantingBattle() == TRUE)
return TRUE; return TRUE;
@@ -222,7 +222,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
IncrementBirthIslandRockStepCount(); IncrementBirthIslandRockStepCount();
if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE) if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.tookStep = TRUE; gFieldInputRecord.tookStep = TRUE;
return TRUE; return TRUE;
} }
} }
@@ -234,7 +234,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.checkStandardWildEncounter = TRUE; gFieldInputRecord.checkStandardWildEncounter = TRUE;
return TRUE; return TRUE;
} }
GetPlayerPosition(&position); GetPlayerPosition(&position);
@@ -243,14 +243,14 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
} }
if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileAttributes) == TRUE) if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileAttributes) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.checkStandardWildEncounter = TRUE; gFieldInputRecord.checkStandardWildEncounter = TRUE;
return TRUE; return TRUE;
} }
if (input->heldDirection && input->dpadDirection == playerDirection) if (input->heldDirection && input->dpadDirection == playerDirection)
{ {
if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE) if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.heldDirection = TRUE; gFieldInputRecord.heldDirection = TRUE;
return TRUE; return TRUE;
} }
} }
@@ -261,14 +261,14 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
{ {
if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.heldDirection = TRUE; gFieldInputRecord.heldDirection = TRUE;
return TRUE; return TRUE;
} }
} }
if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.pressedAButton = TRUE; gFieldInputRecord.pressedAButton = TRUE;
return TRUE; return TRUE;
} }
@@ -276,14 +276,14 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
{ {
if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE) if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE)
{ {
gInputToStoreInQuestLogMaybe.heldDirection2 = TRUE; gFieldInputRecord.heldDirection2 = TRUE;
return TRUE; return TRUE;
} }
} }
if (input->pressedStartButton) if (input->pressedStartButton)
{ {
gInputToStoreInQuestLogMaybe.pressedStartButton = TRUE; gFieldInputRecord.pressedStartButton = TRUE;
FlagSet(FLAG_OPENED_START_MENU); FlagSet(FLAG_OPENED_START_MENU);
PlaySE(SE_WIN_OPEN); PlaySE(SE_WIN_OPEN);
ShowStartMenu(); ShowStartMenu();
@@ -291,7 +291,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
} }
if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE)
{ {
gInputToStoreInQuestLogMaybe.pressedSelectButton = TRUE; gFieldInputRecord.pressedSelectButton = TRUE;
return TRUE; return TRUE;
} }
+3 -3
View File
@@ -1602,11 +1602,11 @@ void CreateStopSurfingTask_NoMusicChange(u8 direction)
void SeafoamIslandsB4F_CurrentDumpsPlayerOnLand(void) void SeafoamIslandsB4F_CurrentDumpsPlayerOnLand(void)
{ {
if (gQuestLogPlaybackState != 1 && gQuestLogPlaybackState != 3) if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)
{ return;
QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16); QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16);
CreateStopSurfingTask(DIR_NORTH); CreateStopSurfingTask(DIR_NORTH);
}
} }
static void Task_StopSurfingInit(u8 taskId) static void Task_StopSurfingInit(u8 taskId)
+39 -37
View File
@@ -1095,8 +1095,10 @@ void DrawElevatorCurrentFloorWindow(void)
{ {
const u8 *floorname; const u8 *floorname;
u32 strwidth; u32 strwidth;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE)
{ if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return;
sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate); sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate);
LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13)); LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13));
DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13); DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13);
@@ -1106,7 +1108,6 @@ void DrawElevatorCurrentFloorWindow(void)
AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL);
PutWindowTilemap(sElevatorCurrentFloorWindowId); PutWindowTilemap(sElevatorCurrentFloorWindowId);
CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL); CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL);
}
} }
void CloseElevatorCurrentFloorWindow(void) void CloseElevatorCurrentFloorWindow(void)
@@ -1164,8 +1165,10 @@ void ListMenu(void)
{ {
u8 taskId; u8 taskId;
struct Task *task; struct Task *task;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE)
{ if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return;
taskId = CreateTask(Task_CreateScriptListMenu, 8); taskId = CreateTask(Task_CreateScriptListMenu, 8);
task = &gTasks[taskId]; task = &gTasks[taskId];
switch (gSpecialVar_0x8004) switch (gSpecialVar_0x8004)
@@ -1249,7 +1252,6 @@ void ListMenu(void)
DestroyTask(taskId); DestroyTask(taskId);
break; break;
} }
}
} }
static const u8 *const sListMenuLabels[][12] = { static const u8 *const sListMenuLabels[][12] = {
@@ -1810,7 +1812,7 @@ static const struct {
u16 inside_num; u16 inside_num;
u16 outside_grp; u16 outside_grp;
u16 outside_num; u16 outside_num;
} sInsideOutsidePairs[51] = { } sInsideOutsidePairs[] = {
[QL_LOCATION_HOME] = {MAP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP(PALLET_TOWN)}, [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_OAKS_LAB] = {MAP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP(PALLET_TOWN)},
[QL_LOCATION_VIRIDIAN_GYM] = {MAP(VIRIDIAN_CITY_GYM), MAP(VIRIDIAN_CITY)}, [QL_LOCATION_VIRIDIAN_GYM] = {MAP(VIRIDIAN_CITY_GYM), MAP(VIRIDIAN_CITY)},
@@ -1881,67 +1883,67 @@ void QuestLog_CheckDepartingIndoorsMap(void)
} }
} }
struct QuestLogDepartedData {
u8 map_section_id;
u8 entrance_id;
};
void QuestLog_TryRecordDepartedLocation(void) void QuestLog_TryRecordDepartedLocation(void)
{ {
s16 x, y; s16 x, y;
struct QuestLogDepartedData event_buffer; struct QuestLogEvent_Departed data;
u16 ql_entrance_id = VarGet(VAR_QL_ENTRANCE); u16 locationId = VarGet(VAR_QL_ENTRANCE);
event_buffer.map_section_id = 0; data.mapSec = 0;
event_buffer.entrance_id = 0; data.locationId = 0;
if (FlagGet(FLAG_SYS_QL_DEPARTED)) if (FlagGet(FLAG_SYS_QL_DEPARTED))
{ {
if (ql_entrance_id == QL_LOCATION_VIRIDIAN_FOREST_1) if (locationId == QL_LOCATION_VIRIDIAN_FOREST_1)
{ {
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE))) 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)))
{ {
event_buffer.map_section_id = MAPSEC_ROUTE_2; data.mapSec = MAPSEC_ROUTE_2;
if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)) if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE))
event_buffer.entrance_id = ql_entrance_id; data.locationId = locationId;
else else
event_buffer.entrance_id = ql_entrance_id + 1; data.locationId = locationId + 1;
SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);
FlagClear(FLAG_SYS_QL_DEPARTED); FlagClear(FLAG_SYS_QL_DEPARTED);
return; return;
} }
} }
else if (ql_entrance_id == QL_LOCATION_LEAGUE_GATE_1) else if (locationId == QL_LOCATION_LEAGUE_GATE_1)
{ {
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23))) if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) &&
(gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22)
|| gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23)))
{ {
event_buffer.map_section_id = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[ql_entrance_id].inside_grp, sInsideOutsidePairs[ql_entrance_id].inside_num)->regionMapSectionId; data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId;
if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22)) if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22))
event_buffer.entrance_id = ql_entrance_id; data.locationId = locationId;
else else
event_buffer.entrance_id = ql_entrance_id + 1; data.locationId = locationId + 1;
SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);
FlagClear(FLAG_SYS_QL_DEPARTED); FlagClear(FLAG_SYS_QL_DEPARTED);
return; return;
} }
} }
if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[ql_entrance_id].outside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[ql_entrance_id].outside_num) if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[locationId].outside_grp
&& gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[locationId].outside_num)
{ {
event_buffer.map_section_id = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[ql_entrance_id].inside_grp, sInsideOutsidePairs[ql_entrance_id].inside_num)->regionMapSectionId; data.mapSec = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[locationId].inside_grp, sInsideOutsidePairs[locationId].inside_num)->regionMapSectionId;
event_buffer.entrance_id = ql_entrance_id; data.locationId = locationId;
if (ql_entrance_id == QL_LOCATION_ROCK_TUNNEL_1) if (locationId == QL_LOCATION_ROCK_TUNNEL_1)
{ {
PlayerGetDestCoords(&x, &y); PlayerGetDestCoords(&x, &y);
if (x != 15 || y != 26) if (x != 15 || y != 26)
event_buffer.entrance_id++; data.locationId++;
} }
else if (ql_entrance_id == QL_LOCATION_SEAFOAM_ISLANDS_1) else if (locationId == QL_LOCATION_SEAFOAM_ISLANDS_1)
{ {
PlayerGetDestCoords(&x, &y); PlayerGetDestCoords(&x, &y);
if (x != 67 || y != 15) if (x != 67 || y != 15)
event_buffer.entrance_id++; data.locationId++;
} }
SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); SetQuestLogEvent(QL_EVENT_DEPARTED, (const u16 *)&data);
FlagClear(FLAG_SYS_QL_DEPARTED); FlagClear(FLAG_SYS_QL_DEPARTED);
if (ql_entrance_id == QL_LOCATION_ROCKET_HIDEOUT) if (locationId == QL_LOCATION_ROCKET_HIDEOUT)
{ {
VarSet(VAR_QL_ENTRANCE, QL_LOCATION_GAME_CORNER); VarSet(VAR_QL_ENTRANCE, QL_LOCATION_GAME_CORNER);
FlagSet(FLAG_SYS_QL_DEPARTED); FlagSet(FLAG_SYS_QL_DEPARTED);
+7 -16
View File
@@ -567,16 +567,8 @@ u16 BagGetQuantityByItemId(u16 itemId)
void TrySetObtainedItemQuestLogEvent(u16 itemId) void TrySetObtainedItemQuestLogEvent(u16 itemId)
{ {
struct QuestLogStruct_809A824
{
u16 itemId;
u8 mapSectionId;
} * ptr;
// Only some key items trigger this event // Only some key items trigger this event
if if (itemId == ITEM_OAKS_PARCEL
(
itemId == ITEM_OAKS_PARCEL
|| itemId == ITEM_POKE_FLUTE || itemId == ITEM_POKE_FLUTE
|| itemId == ITEM_SECRET_KEY || itemId == ITEM_SECRET_KEY
|| itemId == ITEM_BIKE_VOUCHER || itemId == ITEM_BIKE_VOUCHER
@@ -595,16 +587,15 @@ void TrySetObtainedItemQuestLogEvent(u16 itemId)
|| itemId == ITEM_TEA || itemId == ITEM_TEA
|| itemId == ITEM_POWDER_JAR || itemId == ITEM_POWDER_JAR
|| itemId == ITEM_RUBY || itemId == ITEM_RUBY
|| itemId == ITEM_SAPPHIRE || itemId == ITEM_SAPPHIRE)
)
{ {
if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_RIVALS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_RIVALS_HOUSE))) if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_RIVALS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_RIVALS_HOUSE)))
{ {
ptr = malloc(sizeof(*ptr)); struct QuestLogEvent_StoryItem * data = malloc(sizeof(*data));
ptr->itemId = itemId; data->itemId = itemId;
ptr->mapSectionId = gMapHeader.regionMapSectionId; data->mapSec = gMapHeader.regionMapSectionId;
SetQuestLogEvent(QL_EVENT_OBTAINED_ITEM, (void *)ptr); SetQuestLogEvent(QL_EVENT_OBTAINED_STORY_ITEM, (const u16 *)data);
free(ptr); free(data);
} }
} }
} }
+3 -2
View File
@@ -33,6 +33,7 @@
#include "tm_case.h" #include "tm_case.h"
#include "constants/items.h" #include "constants/items.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/quest_log.h"
#define FREE_IF_SET(ptr) ({ if (ptr) Free(ptr); }) #define FREE_IF_SET(ptr) ({ if (ptr) Free(ptr); })
@@ -1930,7 +1931,7 @@ static void Task_FinalizeSaleToShop(u8 taskId)
PlaySE(SE_SHOP); PlaySE(SE_SHOP);
RemoveBagItem(gSpecialVar_ItemId, data[8]); RemoveBagItem(gSpecialVar_ItemId, data[8]);
AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * data[8]);
RecordItemPurchase(gSpecialVar_ItemId, data[8], 2); RecordItemTransaction(gSpecialVar_ItemId, data[8], QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);
DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); DestroyListMenuTask(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]);
Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket); Pocket_CalculateNItemsAndMaxShowed(gBagMenuState.pocket);
PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket); PocketCalculateInitialCursorPosAndItemsAbove(gBagMenuState.pocket);
@@ -2005,7 +2006,7 @@ static void Task_TryDoItemDeposit(u8 taskId)
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE) if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE)
{ {
ItemUse_SetQuestLogEvent(28, 0, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_DEPOSITED_ITEM_PC, 0, gSpecialVar_ItemId, 0xFFFF);
CopyItemName(gSpecialVar_ItemId, gStringVar1); CopyItemName(gSpecialVar_ItemId, gStringVar1);
ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
StringExpandPlaceholders(gStringVar4, gText_DepositedStrVar2StrVar1s); StringExpandPlaceholders(gStringVar4, gText_DepositedStrVar2StrVar1s);
+7 -13
View File
@@ -912,20 +912,14 @@ void FieldUseFunc_OakStopsYou(u8 taskId)
void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param) void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param)
{ {
struct UnkStruct_ItemUseQuestLog struct QuestLogEvent_Item *data = Alloc(sizeof(*data));
{
u16 itemId;
u16 unk2;
u16 species;
u16 param;
} *questLog = Alloc(sizeof(*questLog));
questLog->itemId = itemId; data->itemId = itemId;
questLog->param = param; data->itemParam = param;
if (pokemon != NULL) if (pokemon != NULL)
questLog->species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG); data->species = GetMonData(pokemon, MON_DATA_SPECIES_OR_EGG);
else else
questLog->species = 0xFFFF; data->species = 0xFFFF;
SetQuestLogEvent(eventId, (void *)questLog); SetQuestLogEvent(eventId, (void *)data);
Free(questLog); Free(data);
} }
+1 -1
View File
@@ -78,7 +78,7 @@ void SetSaveBlocksPointers(void)
gPokemonStoragePtr = (void *)(&gPokemonStorage) + offset; gPokemonStoragePtr = (void *)(&gPokemonStorage) + offset;
SetBagPocketsPointers(); SetBagPocketsPointers();
SetQuestLogRecordAndPlaybackPointers(oldSave); QL_AddASLROffset(oldSave);
} }
void MoveSaveBlocks_ResetHeap(void) void MoveSaveBlocks_ResetHeap(void)
+1 -1
View File
@@ -213,7 +213,7 @@ static void InitMainCallbacks(void)
gSaveBlock2Ptr = &gSaveBlock2; gSaveBlock2Ptr = &gSaveBlock2;
gSaveBlock1Ptr = &gSaveBlock1; gSaveBlock1Ptr = &gSaveBlock1;
gSaveBlock2.encryptionKey = 0; gSaveBlock2.encryptionKey = 0;
gQuestLogPlaybackState = 0; gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED;
} }
static void CallCallbacks(void) static void CallCallbacks(void)
+1 -1
View File
@@ -478,7 +478,7 @@ static void Task_ExecuteMainMenuSelection(u8 taskId)
gPlttBufferFaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK;
gExitStairsMovementDisabled = FALSE; gExitStairsMovementDisabled = FALSE;
FreeAllWindowBuffers(); FreeAllWindowBuffers();
TrySetUpQuestLogScenes_ElseContinueFromSave(taskId); TryStartQuestLogPlayback(taskId);
break; break;
case MAIN_MENU_MYSTERYGIFT: case MAIN_MENU_MYSTERYGIFT:
SetMainCallback2(CB2_InitMysteryGift); SetMainCallback2(CB2_InitMysteryGift);
+15 -15
View File
@@ -772,7 +772,7 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum)
InitSecondaryTilesetAnimation(); InitSecondaryTilesetAnimation();
UpdateLocationHistoryForRoamer(); UpdateLocationHistoryForRoamer();
RoamerMove(); RoamerMove();
sub_8110920(); QL_ResetDefeatedWildMonRecord();
DoCurrentWeather(); DoCurrentWeather();
ResetFieldTasksArgs(); ResetFieldTasksArgs();
RunOnResumeMapScript(); RunOnResumeMapScript();
@@ -803,7 +803,7 @@ static void LoadMapFromWarp(bool32 unused)
TryRegenerateRenewableHiddenItems(); TryRegenerateRenewableHiddenItems();
UpdateLocationHistoryForRoamer(); UpdateLocationHistoryForRoamer();
RoamerMoveToOtherLocationSet(); RoamerMoveToOtherLocationSet();
sub_8110920(); QL_ResetDefeatedWildMonRecord();
InitMap(); InitMap();
} }
@@ -818,8 +818,8 @@ static void QL_LoadMapNormal(void)
SetSavedWeatherFromCurrMapHeader(); SetSavedWeatherFromCurrMapHeader();
ChooseAmbientCrySpecies(); ChooseAmbientCrySpecies();
SetDefaultFlashLevel(); SetDefaultFlashLevel();
sub_8110920(); QL_ResetDefeatedWildMonRecord();
sub_8111708(); QL_RestoreMapLayoutId();
LoadSaveblockMapHeader(); LoadSaveblockMapHeader();
InitMap(); InitMap();
} }
@@ -1390,7 +1390,7 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys)
{ {
struct FieldInput fieldInput; struct FieldInput fieldInput;
sub_8112B3C(); QL_TryRunActions();
UpdatePlayerAvatarTransitionState(); UpdatePlayerAvatarTransitionState();
FieldClearPlayerInput(&fieldInput); FieldClearPlayerInput(&fieldInput);
FieldGetPlayerInput(&fieldInput, newKeys, heldKeys); FieldGetPlayerInput(&fieldInput, newKeys, heldKeys);
@@ -1399,8 +1399,8 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys)
{ {
if (ProcessPlayerFieldInput(&fieldInput) == TRUE) if (ProcessPlayerFieldInput(&fieldInput) == TRUE)
{ {
if (gQuestLogPlaybackState == 2) if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)
sub_81127F8(&gInputToStoreInQuestLogMaybe); QL_RecordFieldInput(&gFieldInputRecord);
LockPlayerFieldControls(); LockPlayerFieldControls();
DismissMapNamePopup(); DismissMapNamePopup();
} }
@@ -1416,9 +1416,9 @@ static void DoCB1_Overworld_QuestLogPlayback(void)
{ {
struct FieldInput fieldInput; struct FieldInput fieldInput;
sub_8112B3C(); QL_TryRunActions();
UpdatePlayerAvatarTransitionState(); UpdatePlayerAvatarTransitionState();
sub_8111C68(); QL_HandleInput();
FieldClearPlayerInput(&fieldInput); FieldClearPlayerInput(&fieldInput);
fieldInput = gQuestLogFieldInput; fieldInput = gQuestLogFieldInput;
FieldInput_HandleCancelSignpost(&fieldInput); FieldInput_HandleCancelSignpost(&fieldInput);
@@ -1445,7 +1445,7 @@ void CB1_Overworld(void)
{ {
if (gMain.callback2 == CB2_Overworld) if (gMain.callback2 == CB2_Overworld)
{ {
if (sub_8112CAC() == 1 || gQuestLogState == QL_STATE_PLAYBACK) if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)
DoCB1_Overworld_QuestLogPlayback(); DoCB1_Overworld_QuestLogPlayback();
else else
DoCB1_Overworld(gMain.newKeys, gMain.heldKeys); DoCB1_Overworld(gMain.newKeys, gMain.heldKeys);
@@ -1458,7 +1458,7 @@ static void OverworldBasic(void)
RunTasks(); RunTasks();
AnimateSprites(); AnimateSprites();
CameraUpdate(); CameraUpdate();
sub_8115798(); SetQuestLogEvent_Arrived();
UpdateCameraPanning(); UpdateCameraPanning();
BuildOamBuffer(); BuildOamBuffer();
UpdatePaletteFade(); UpdatePaletteFade();
@@ -2239,8 +2239,8 @@ static bool32 LoadMap_QLPlayback(u8 *state)
InitOverworldBgs(); InitOverworldBgs();
FieldClearVBlankHBlankCallbacks(); FieldClearVBlankHBlankCallbacks();
QuestLog_InitPalettesBackup(); QuestLog_InitPalettesBackup();
sub_81113E4(); QL_CopySaveState();
sub_8111438(); QL_ResetPartyAndPC();
if (GetQuestLogStartType() == QL_START_WARP) if (GetQuestLogStartType() == QL_START_WARP)
{ {
gExitStairsMovementDisabled = FALSE; gExitStairsMovementDisabled = FALSE;
@@ -2254,7 +2254,7 @@ static bool32 LoadMap_QLPlayback(u8 *state)
(*state)++; (*state)++;
break; break;
case 1: case 1:
sub_8110FCC(); QL_InitSceneObjectsAndActions();
(*state)++; (*state)++;
break; break;
case 2: case 2:
@@ -2296,7 +2296,7 @@ static bool32 LoadMap_QLPlayback(u8 *state)
break; break;
case 10: case 10:
InitTilesetAnimations(); InitTilesetAnimations();
sub_815A540(); QL_TryStopSurfing();
(*state)++; (*state)++;
break; break;
default: default:
+37 -43
View File
@@ -3355,12 +3355,12 @@ static void SwitchPartyMon(void)
static void SetSwitchedPartyOrderQuestLogEvent(void) static void SetSwitchedPartyOrderQuestLogEvent(void)
{ {
u16 *buffer = Alloc(2 * sizeof(u16)); struct QuestLogEvent_SwitchedPartyOrder * data = Alloc(sizeof(*data));
buffer[0] = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG); data->species1 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES_OR_EGG);
buffer[1] = GetMonData(&gPlayerParty[gPartyMenu.slotId2], MON_DATA_SPECIES_OR_EGG); data->species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId2], MON_DATA_SPECIES_OR_EGG);
SetQuestLogEvent(QL_EVENT_SWITCHED_PARTY_ORDER, buffer); SetQuestLogEvent(QL_EVENT_SWITCHED_PARTY_ORDER, (const u16 *)data);
Free(buffer); Free(data);
} }
// Finish switching mons or using Softboiled // Finish switching mons or using Softboiled
@@ -4131,67 +4131,61 @@ static bool8 SetUpFieldMove_Waterfall(void)
static void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2) static void SetSwappedHeldItemQuestLogEvent(struct Pokemon *mon, u16 item, u16 item2)
{ {
u16 *ptr = Alloc(4 * sizeof(u16)); struct QuestLogEvent_SwappedHeldItem *data = Alloc(sizeof(*data));
ptr[2] = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);
ptr[0] = item; data->takenItemId = item;
ptr[1] = item2; data->givenItemId = item2;
if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM)
SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, ptr); SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM_PC, (void *)data);
else else
SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM, ptr); SetQuestLogEvent(QL_EVENT_SWAPPED_HELD_ITEM, (void *)data);
Free(ptr); Free(data);
} }
struct FieldMoveWarpParams
{
u16 species;
u8 fieldMove;
u8 regionMapSectionId;
};
static void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove) static void SetUsedFieldMoveQuestLogEvent(struct Pokemon *mon, u8 fieldMove)
{ {
struct FieldMoveWarpParams *ptr = Alloc(sizeof(*ptr)); struct QuestLogEvent_FieldMove *data = Alloc(sizeof(*data));
ptr->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); data->species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG);
ptr->fieldMove = fieldMove; data->fieldMove = fieldMove;
switch (ptr->fieldMove) switch (data->fieldMove)
{ {
case FIELD_MOVE_TELEPORT: case FIELD_MOVE_TELEPORT:
ptr->regionMapSectionId = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum)->regionMapSectionId; data->mapSec = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum)->regionMapSectionId;
break; break;
case FIELD_MOVE_DIG: case FIELD_MOVE_DIG:
ptr->regionMapSectionId = gMapHeader.regionMapSectionId; data->mapSec = gMapHeader.regionMapSectionId;
break; break;
default: default:
ptr->regionMapSectionId = 0xFF; data->mapSec = 0xFF;
} }
SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (u16 *)ptr); SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data);
Free(ptr); Free(data);
} }
void SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData) void SetUsedFlyQuestLogEvent(const u8 *healLocCtrlData)
{ {
const struct MapHeader *mapHeader; const struct MapHeader *mapHeader;
struct FieldMoveWarpParams *ptr2; struct QuestLogEvent_FieldMove *data;
struct struct
{ {
s8 mapGroup; s8 group;
s8 mapNum; s8 num;
u32 unk_4; u32 unused;
} *ptr = Alloc(sizeof(*ptr)); } *map = Alloc(sizeof(*map));
ptr->mapGroup = healLocCtrlData[0]; map->group = healLocCtrlData[0];
ptr->mapNum = healLocCtrlData[1]; map->num = healLocCtrlData[1];
mapHeader = Overworld_GetMapHeaderByGroupAndId(ptr->mapGroup, ptr->mapNum); mapHeader = Overworld_GetMapHeaderByGroupAndId(map->group, map->num);
Free(ptr); Free(map);
ptr2 = Alloc(4);
ptr2->species = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_SPECIES_OR_EGG); data = Alloc(sizeof(*data));
ptr2->fieldMove = FIELD_MOVE_FLY; data->species = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_SPECIES_OR_EGG);
ptr2->regionMapSectionId = mapHeader->regionMapSectionId; data->fieldMove = FIELD_MOVE_FLY;
SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (u16 *)ptr2); data->mapSec = mapHeader->regionMapSectionId;
Free(ptr2); SetQuestLogEvent(QL_EVENT_USED_FIELD_MOVE, (const u16 *)data);
Free(data);
} }
void CB2_ShowPartyMenuForItemUse(void) void CB2_ShowPartyMenuForItemUse(void)
+2 -2
View File
@@ -2672,7 +2672,7 @@ static void InitCursorItemIcon(void)
static void SetPokeStorageQuestLogEvent(u8 action) static void SetPokeStorageQuestLogEvent(u8 action)
{ {
u16 event; u16 event;
struct PokeStorageQuestLogData *questLogData; struct QuestLogEvent_MovedBoxMon *questLogData;
u8 box1 = GetMovingMonOriginalBoxId(); u8 box1 = GetMovingMonOriginalBoxId();
u16 species1 = gStorage->displayMonSpecies; u16 species1 = gStorage->displayMonSpecies;
u16 species2; u16 species2;
@@ -2687,7 +2687,7 @@ static void SetPokeStorageQuestLogEvent(u8 action)
box2 = StorageGetCurrentBox(); box2 = StorageGetCurrentBox();
species2 = GetCurrentBoxMonData(GetBoxCursorPosition(), MON_DATA_SPECIES_OR_EGG); species2 = GetCurrentBoxMonData(GetBoxCursorPosition(), MON_DATA_SPECIES_OR_EGG);
} }
questLogData = &gStorage->pokeStorageQuestLogData; questLogData = &gStorage->questLogData;
switch (action) switch (action)
{ {
+650 -583
View File
File diff suppressed because it is too large Load Diff
+55 -71
View File
@@ -7,30 +7,15 @@
#include "quest_log.h" #include "quest_log.h"
#include "constants/trainers.h" #include "constants/trainers.h"
struct QuestLogStruct_TrainerBattleRecord static void GetLinkMultiBattlePlayerIndexes(s32 *, s32 *);
{
u16 v0;
u16 v2;
u16 v4;
u8 v6;
u8 v7;
};
struct QuestLogStruct_WildBattleRecord
{
u16 defeatedSpecies;
u16 caughtSpecies;
u8 mapSec;
};
static void sub_812C334(s32 *, s32 *);
void TrySetQuestLogBattleEvent(void) void TrySetQuestLogBattleEvent(void)
{ {
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))
{ {
struct QuestLogStruct_TrainerBattleRecord * questLogTrainerBattleRecord = Alloc(sizeof(struct QuestLogStruct_TrainerBattleRecord)); // Why allocate both of these? Only one will ever be used at a time
struct QuestLogStruct_WildBattleRecord * questLogWildBattleRecord = Alloc(sizeof(struct QuestLogStruct_WildBattleRecord)); struct QuestLogEvent_TrainerBattle * trainerData = Alloc(sizeof(*trainerData));
struct QuestLogEvent_WildBattle * wildData = Alloc(sizeof(*wildData));
u16 eventId; u16 eventId;
u16 playerEndingHP; u16 playerEndingHP;
u16 playerMaxHP; u16 playerMaxHP;
@@ -52,81 +37,81 @@ void TrySetQuestLogBattleEvent(void)
eventId = QL_EVENT_DEFEATED_TRAINER; eventId = QL_EVENT_DEFEATED_TRAINER;
break; break;
} }
questLogTrainerBattleRecord->v0 = gTrainerBattleOpponent_A; trainerData->trainerId = gTrainerBattleOpponent_A;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{ {
questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies; trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies;
if (GetBattlerSide(gBattleStruct->field_182) == B_SIDE_PLAYER)
questLogTrainerBattleRecord->v4 = gBattleMons[gBattleStruct->field_182].species; // Decide which of the pokemon on the player's side to mention as the victor
if (GetBattlerSide(gBattleStruct->lastAttackerToFaintOpponent) == B_SIDE_PLAYER)
trainerData->speciesPlayer = gBattleMons[gBattleStruct->lastAttackerToFaintOpponent].species;
else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0) else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0)
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species; trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species;
else else
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(2)].species; trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(2)].species;
playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp; playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp;
playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP; playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP;
} }
else else
{ {
questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies; trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies;
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species; trainerData->speciesPlayer = gBattleMons[GetBattlerAtPosition(0)].species;
playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp; playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp;
playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP; playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP;
} }
questLogTrainerBattleRecord->v7 = GetCurrentRegionMapSectionId(); trainerData->mapSec = GetCurrentRegionMapSectionId();
questLogTrainerBattleRecord->v6 = 0;
// Calculate fractional HP loss (determines flavor text, e.g. "handily" vs "somehow" defeated trainer)
trainerData->hpFractionId = 0;
if (playerEndingHP < playerMaxHP / 3 * 2) if (playerEndingHP < playerMaxHP / 3 * 2)
questLogTrainerBattleRecord->v6 = 1; trainerData->hpFractionId++;
if (playerEndingHP < playerMaxHP / 3) if (playerEndingHP < playerMaxHP / 3)
questLogTrainerBattleRecord->v6++; trainerData->hpFractionId++;
SetQuestLogEvent(eventId, (const u16 *)questLogTrainerBattleRecord);
SetQuestLogEvent(eventId, (const u16 *)trainerData);
} }
else else
{ {
if (gBattleOutcome == B_OUTCOME_WON) if (gBattleOutcome == B_OUTCOME_WON)
{ {
questLogWildBattleRecord->defeatedSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES); wildData->defeatedSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);
questLogWildBattleRecord->caughtSpecies = SPECIES_NONE; wildData->caughtSpecies = SPECIES_NONE;
} }
else // gBattleOutcome == B_OUTCOME_CAUGHT else // gBattleOutcome == B_OUTCOME_CAUGHT
{ {
questLogWildBattleRecord->defeatedSpecies = SPECIES_NONE; wildData->defeatedSpecies = SPECIES_NONE;
questLogWildBattleRecord->caughtSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES); wildData->caughtSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);
} }
questLogWildBattleRecord->mapSec = GetCurrentRegionMapSectionId(); wildData->mapSec = GetCurrentRegionMapSectionId();
SetQuestLogEvent(QL_EVENT_DEFEATED_WILD_MON, (const u16 *)questLogWildBattleRecord); SetQuestLogEvent(QL_EVENT_DEFEATED_WILD_MON, (const u16 *)wildData);
} }
Free(questLogTrainerBattleRecord); Free(trainerData);
Free(questLogWildBattleRecord); Free(wildData);
} }
} }
struct QuestLogStruct_LinkBattleRecord
{
u8 v0;
u8 v1[3][7];
};
void TrySetQuestLogLinkBattleEvent(void) void TrySetQuestLogLinkBattleEvent(void)
{ {
s32 sp0; s32 partnerIdx;
s32 sp4[2]; s32 opponentIdxs[2];
u16 eventId; u16 eventId;
s32 r3; s32 i;
bool32 inUnionRoom; bool32 inUnionRoom;
if (gBattleTypeFlags & BATTLE_TYPE_LINK) if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{ {
struct QuestLogStruct_LinkBattleRecord * r5 = Alloc(sizeof(struct QuestLogStruct_LinkBattleRecord)); struct QuestLogEvent_LinkBattle * data = Alloc(sizeof(*data));
r5->v0 = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew data->outcome = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew
if (gBattleTypeFlags & BATTLE_TYPE_MULTI) if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{ {
eventId = QL_EVENT_LINK_BATTLED_MULTI; eventId = QL_EVENT_LINK_BATTLED_MULTI;
sub_812C334(&sp0, sp4); GetLinkMultiBattlePlayerIndexes(&partnerIdx, opponentIdxs);
for (r3 = 0; r3 < 7; r3++) for (i = 0; i < PLAYER_NAME_LENGTH; i++)
{ {
r5->v1[0][r3] = gLinkPlayers[sp0].name[r3]; data->playerNames[0][i] = gLinkPlayers[partnerIdx].name[i];
r5->v1[1][r3] = gLinkPlayers[sp4[0]].name[r3]; data->playerNames[1][i] = gLinkPlayers[opponentIdxs[0]].name[i];
r5->v1[2][r3] = gLinkPlayers[sp4[1]].name[r3]; data->playerNames[2][i] = gLinkPlayers[opponentIdxs[1]].name[i];
} }
} }
else else
@@ -141,26 +126,25 @@ void TrySetQuestLogLinkBattleEvent(void)
if (inUnionRoom == TRUE) if (inUnionRoom == TRUE)
eventId = QL_EVENT_LINK_BATTLED_UNION; eventId = QL_EVENT_LINK_BATTLED_UNION;
} }
for (r3 = 0; r3 < 7; r3++)
{ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
r5->v1[0][r3] = gLinkPlayers[gBattleStruct->multiplayerId ^ 1].name[r3]; data->playerNames[0][i] = gLinkPlayers[gBattleStruct->multiplayerId ^ 1].name[i];
} }
} SetQuestLogEvent(eventId, (const u16 *)data);
SetQuestLogEvent(eventId, (const u16 *)r5); Free(data);
Free(r5);
} }
} }
static void sub_812C334(s32 * a0, s32 * a1) static void GetLinkMultiBattlePlayerIndexes(s32 * partnerIdx, s32 * opponentIdxs)
{ {
s32 r5; s32 i;
s32 _optimized_out = 0; s32 numOpponentsFound = 0;
u8 r2 = gLinkPlayers[gBattleStruct->multiplayerId].id ^ 2; u8 partnerId = gLinkPlayers[gBattleStruct->multiplayerId].id ^ 2;
for (r5 = 0; r5 < 4; r5++) for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{ {
if (r2 == gLinkPlayers[r5].id) if (partnerId == gLinkPlayers[i].id)
a0[0] = r5; *partnerIdx = i;
else if (r5 != gBattleStruct->multiplayerId) else if (i != gBattleStruct->multiplayerId)
a1[_optimized_out++] = r5; opponentIdxs[numOpponentsFound++] = i;
} }
} }
+1105 -1009
View File
File diff suppressed because it is too large Load Diff
+43 -43
View File
@@ -4,51 +4,51 @@
#include "field_player_avatar.h" #include "field_player_avatar.h"
#include "metatile_behavior.h" #include "metatile_behavior.h"
void SetQuestLogObjectEventsData(struct QuestLog * questLog) void QL_RecordObjects(struct QuestLogScene * questLog)
{ {
u32 i; u32 i;
for (i = 0; i < OBJECT_EVENTS_COUNT; i++) for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{ {
questLog->unk_008[i].active = gObjectEvents[i].active; questLog->objectEvents[i].active = gObjectEvents[i].active;
questLog->unk_008[i].triggerGroundEffectsOnStop = gObjectEvents[i].triggerGroundEffectsOnStop; questLog->objectEvents[i].triggerGroundEffectsOnStop = gObjectEvents[i].triggerGroundEffectsOnStop;
questLog->unk_008[i].disableCoveringGroundEffects = gObjectEvents[i].disableCoveringGroundEffects; questLog->objectEvents[i].disableCoveringGroundEffects = gObjectEvents[i].disableCoveringGroundEffects;
questLog->unk_008[i].landingJump = gObjectEvents[i].landingJump; questLog->objectEvents[i].landingJump = gObjectEvents[i].landingJump;
questLog->unk_008[i].frozen = gObjectEvents[i].frozen; questLog->objectEvents[i].frozen = gObjectEvents[i].frozen;
questLog->unk_008[i].facingDirectionLocked = gObjectEvents[i].facingDirectionLocked; questLog->objectEvents[i].facingDirectionLocked = gObjectEvents[i].facingDirectionLocked;
questLog->unk_008[i].disableAnim = gObjectEvents[i].disableAnim; questLog->objectEvents[i].disableAnim = gObjectEvents[i].disableAnim;
questLog->unk_008[i].enableAnim = gObjectEvents[i].enableAnim; questLog->objectEvents[i].enableAnim = gObjectEvents[i].enableAnim;
questLog->unk_008[i].inanimate = gObjectEvents[i].inanimate; questLog->objectEvents[i].inanimate = gObjectEvents[i].inanimate;
questLog->unk_008[i].invisible = gObjectEvents[i].invisible; questLog->objectEvents[i].invisible = gObjectEvents[i].invisible;
questLog->unk_008[i].offScreen = gObjectEvents[i].offScreen; questLog->objectEvents[i].offScreen = gObjectEvents[i].offScreen;
questLog->unk_008[i].trackedByCamera = gObjectEvents[i].trackedByCamera; questLog->objectEvents[i].trackedByCamera = gObjectEvents[i].trackedByCamera;
questLog->unk_008[i].isPlayer = gObjectEvents[i].isPlayer; questLog->objectEvents[i].isPlayer = gObjectEvents[i].isPlayer;
questLog->unk_008[i].spriteAnimPausedBackup = gObjectEvents[i].spriteAnimPausedBackup; questLog->objectEvents[i].spriteAnimPausedBackup = gObjectEvents[i].spriteAnimPausedBackup;
questLog->unk_008[i].spriteAffineAnimPausedBackup = gObjectEvents[i].spriteAffineAnimPausedBackup; questLog->objectEvents[i].spriteAffineAnimPausedBackup = gObjectEvents[i].spriteAffineAnimPausedBackup;
questLog->unk_008[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect; questLog->objectEvents[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect;
questLog->unk_008[i].fixedPriority = gObjectEvents[i].fixedPriority; questLog->objectEvents[i].fixedPriority = gObjectEvents[i].fixedPriority;
questLog->unk_008[i].mapobj_unk_18 = gObjectEvents[i].facingDirection; questLog->objectEvents[i].facingDirection = gObjectEvents[i].facingDirection;
questLog->unk_008[i].mapobj_unk_0B_0 = gObjectEvents[i].currentElevation; questLog->objectEvents[i].currentElevation = gObjectEvents[i].currentElevation;
questLog->unk_008[i].elevation = gObjectEvents[i].previousElevation; questLog->objectEvents[i].previousElevation = gObjectEvents[i].previousElevation;
questLog->unk_008[i].graphicsId = gObjectEvents[i].graphicsId; questLog->objectEvents[i].graphicsId = gObjectEvents[i].graphicsId;
questLog->unk_008[i].animPattern = gObjectEvents[i].movementType; questLog->objectEvents[i].movementType = gObjectEvents[i].movementType;
questLog->unk_008[i].trainerType = gObjectEvents[i].trainerType; questLog->objectEvents[i].trainerType = gObjectEvents[i].trainerType;
questLog->unk_008[i].localId = gObjectEvents[i].localId; questLog->objectEvents[i].localId = gObjectEvents[i].localId;
questLog->unk_008[i].mapNum = gObjectEvents[i].mapNum; questLog->objectEvents[i].mapNum = gObjectEvents[i].mapNum;
questLog->unk_008[i].mapGroup = gObjectEvents[i].mapGroup; questLog->objectEvents[i].mapGroup = gObjectEvents[i].mapGroup;
questLog->unk_008[i].x = gObjectEvents[i].currentCoords.x; questLog->objectEvents[i].x = gObjectEvents[i].currentCoords.x;
questLog->unk_008[i].y = gObjectEvents[i].currentCoords.y; questLog->objectEvents[i].y = gObjectEvents[i].currentCoords.y;
questLog->unk_008[i].trainerRange_berryTreeId = gObjectEvents[i].trainerRange_berryTreeId; questLog->objectEvents[i].trainerRange_berryTreeId = gObjectEvents[i].trainerRange_berryTreeId;
questLog->unk_008[i].previousMetatileBehavior = gObjectEvents[i].previousMetatileBehavior; questLog->objectEvents[i].previousMetatileBehavior = gObjectEvents[i].previousMetatileBehavior;
questLog->unk_008[i].directionSequenceIndex = gObjectEvents[i].directionSequenceIndex; questLog->objectEvents[i].directionSequenceIndex = gObjectEvents[i].directionSequenceIndex;
questLog->unk_008[i].animId = gObjectEvents[i].playerCopyableMovement; questLog->objectEvents[i].animId = gObjectEvents[i].playerCopyableMovement;
} }
} }
void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const struct ObjectEventTemplate * templates) void QL_LoadObjects(const struct QuestLogScene * questLog, const struct ObjectEventTemplate * templates)
{ {
u32 i, j; u32 i, j;
const struct QuestLogObjectEvent * questLogObjectEvents = questLog->unk_008; const struct QuestLogObjectEvent * questLogObjectEvents = questLog->objectEvents;
CpuFill16(0, gObjectEvents, sizeof(gObjectEvents)); CpuFill16(0, gObjectEvents, sizeof(gObjectEvents));
@@ -71,11 +71,11 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str
gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].spriteAffineAnimPausedBackup; gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].spriteAffineAnimPausedBackup;
gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect; gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect;
gObjectEvents[i].fixedPriority = questLogObjectEvents[i].fixedPriority; gObjectEvents[i].fixedPriority = questLogObjectEvents[i].fixedPriority;
gObjectEvents[i].facingDirection = questLogObjectEvents[i].mapobj_unk_18; gObjectEvents[i].facingDirection = questLogObjectEvents[i].facingDirection;
gObjectEvents[i].currentElevation = questLogObjectEvents[i].mapobj_unk_0B_0; gObjectEvents[i].currentElevation = questLogObjectEvents[i].currentElevation;
gObjectEvents[i].previousElevation = questLogObjectEvents[i].elevation; gObjectEvents[i].previousElevation = questLogObjectEvents[i].previousElevation;
gObjectEvents[i].graphicsId = questLogObjectEvents[i].graphicsId; gObjectEvents[i].graphicsId = questLogObjectEvents[i].graphicsId;
gObjectEvents[i].movementType = questLogObjectEvents[i].animPattern; gObjectEvents[i].movementType = questLogObjectEvents[i].movementType;
gObjectEvents[i].trainerType = questLogObjectEvents[i].trainerType; gObjectEvents[i].trainerType = questLogObjectEvents[i].trainerType;
gObjectEvents[i].localId = questLogObjectEvents[i].localId; gObjectEvents[i].localId = questLogObjectEvents[i].localId;
gObjectEvents[i].mapNum = questLogObjectEvents[i].mapNum; gObjectEvents[i].mapNum = questLogObjectEvents[i].mapNum;
@@ -87,12 +87,12 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str
gObjectEvents[i].directionSequenceIndex = questLogObjectEvents[i].directionSequenceIndex; gObjectEvents[i].directionSequenceIndex = questLogObjectEvents[i].directionSequenceIndex;
gObjectEvents[i].playerCopyableMovement = questLogObjectEvents[i].animId; gObjectEvents[i].playerCopyableMovement = questLogObjectEvents[i].animId;
for (j = 0; j < 0x40; j++) for (j = 0; j < OBJECT_EVENT_TEMPLATES_COUNT; j++)
{ {
if (gObjectEvents[i].localId == templates[j].localId) if (gObjectEvents[i].localId == templates[j].localId)
{ {
gObjectEvents[i].initialCoords.x = templates[j].x + 7; gObjectEvents[i].initialCoords.x = templates[j].x + MAP_OFFSET;
gObjectEvents[i].initialCoords.y = templates[j].y + 7; gObjectEvents[i].initialCoords.y = templates[j].y + MAP_OFFSET;
gObjectEvents[i].rangeX = templates[j].objUnion.normal.movementRangeX; gObjectEvents[i].rangeX = templates[j].objUnion.normal.movementRangeX;
gObjectEvents[i].rangeY = templates[j].objUnion.normal.movementRangeY; gObjectEvents[i].rangeY = templates[j].objUnion.normal.movementRangeY;
} }
@@ -129,7 +129,7 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str
CpuCopy16(gObjectEvents, gSaveBlock1Ptr->objectEvents, sizeof(gObjectEvents)); CpuCopy16(gObjectEvents, gSaveBlock1Ptr->objectEvents, sizeof(gObjectEvents));
} }
void sub_815A540(void) void QL_TryStopSurfing(void)
{ {
if (gQuestLogState == QL_STATE_PLAYBACK) if (gQuestLogState == QL_STATE_PLAYBACK)
{ {
+2 -2
View File
@@ -42,7 +42,7 @@ void QuestLogUpdatePlayerSprite(u8 state)
bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state) bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state)
{ {
if (gQuestLogPlaybackState == 2) if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)
{ {
QuestLogRecordPlayerAvatarGfxTransition(state); QuestLogRecordPlayerAvatarGfxTransition(state);
return TRUE; return TRUE;
@@ -77,7 +77,7 @@ static void QL_GfxTransition_Fish(void)
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
struct Sprite *sprite = &gSprites[objectEvent->spriteId]; struct Sprite *sprite = &gSprites[objectEvent->spriteId];
if (gQuestLogPlaybackState == 1 || gQuestLogPlaybackState == 3) if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)
{ {
u8 taskId; u8 taskId;
LockPlayerFieldControls(); LockPlayerFieldControls();
+4 -4
View File
@@ -1336,7 +1336,7 @@ static bool8 WaitForAorBPress(void)
} }
} }
} }
if (sub_8112CAC() == 1 || gQuestLogState == QL_STATE_PLAYBACK) if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)
{ {
if (sQuestLogWaitButtonPressTimer == 120) if (sQuestLogWaitButtonPressTimer == 120)
return TRUE; return TRUE;
@@ -1401,7 +1401,7 @@ bool8 ScrCmd_waitbuttonpress(struct ScriptContext * ctx)
{ {
sQuestLogScriptContextPtr = ctx; sQuestLogScriptContextPtr = ctx;
if (sub_8112CAC() == 1 || gQuestLogState == QL_STATE_PLAYBACK) if (QL_GetPlaybackState() == QL_PLAYBACK_STATE_RUNNING || gQuestLogState == QL_STATE_PLAYBACK)
sQuestLogWaitButtonPressTimer = 0; sQuestLogWaitButtonPressTimer = 0;
SetupNativeScript(ctx, WaitForAorBPress); SetupNativeScript(ctx, WaitForAorBPress);
return TRUE; return TRUE;
@@ -1818,7 +1818,7 @@ bool8 ScrCmd_showmoneybox(struct ScriptContext * ctx)
u8 y = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx);
u8 ignore = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx);
if (!ignore && QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE) if (!ignore && QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)
DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y); DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y);
return FALSE; return FALSE;
} }
@@ -1848,7 +1848,7 @@ bool8 ScrCmd_showcoinsbox(struct ScriptContext * ctx)
u8 x = ScriptReadByte(ctx); u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx);
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE) if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)
ShowCoinsWindow(GetCoins(), x, y); ShowCoinsWindow(GetCoins(), x, y);
return FALSE; return FALSE;
} }
+17 -13
View File
@@ -715,7 +715,7 @@ static void DrawVerticalMultichoiceMenu(u8 left, u8 top, u8 mcId, u8 ignoreBpres
u8 windowId; u8 windowId;
const struct MenuAction * list; const struct MenuAction * list;
if ((ignoreBpress & 2) || QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE) if ((ignoreBpress & 2) || QL_AvoidDisplay(QL_DestroyAbortedDisplay) != TRUE)
{ {
ignoreBpress &= 1; ignoreBpress &= 1;
count = sMultichoiceLists[mcId].count; count = sMultichoiceLists[mcId].count;
@@ -860,11 +860,12 @@ bool8 ScriptMenu_YesNo(u8 unused, u8 stuff)
if (FuncIsActiveTask(Task_YesNoMenu_HandleInput) == TRUE) if (FuncIsActiveTask(Task_YesNoMenu_HandleInput) == TRUE)
return FALSE; return FALSE;
gSpecialVar_Result = SCR_MENU_UNSET; gSpecialVar_Result = SCR_MENU_UNSET;
if (!QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites))
{ if (QL_AvoidDisplay(QL_DestroyAbortedDisplay))
return TRUE;
DisplayYesNoMenuDefaultYes(); DisplayYesNoMenuDefaultYes();
CreateTask(Task_YesNoMenu_HandleInput, 80); CreateTask(Task_YesNoMenu_HandleInput, 80);
}
return TRUE; return TRUE;
} }
@@ -915,8 +916,10 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignore
if (FuncIsActiveTask(Hask_MultichoiceGridMenu_HandleInput) == TRUE) if (FuncIsActiveTask(Hask_MultichoiceGridMenu_HandleInput) == TRUE)
return FALSE; return FALSE;
gSpecialVar_Result = SCR_MENU_UNSET; gSpecialVar_Result = SCR_MENU_UNSET;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE)
{ if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return TRUE;
list = sMultichoiceLists[multichoiceId].list; list = sMultichoiceLists[multichoiceId].list;
count = sMultichoiceLists[multichoiceId].count; count = sMultichoiceLists[multichoiceId].count;
width = GetMenuWidthFromList(list, count) + 1; width = GetMenuWidthFromList(list, count) + 1;
@@ -928,7 +931,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignore
MultichoiceGrid_PrintItems(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, width * 8, 16, columnCount, rowCount, list); MultichoiceGrid_PrintItems(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, width * 8, 16, columnCount, rowCount, list);
MultichoiceGrid_InitCursor(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, 0, 1, width * 8, columnCount, rowCount, 0); MultichoiceGrid_InitCursor(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, 0, 1, width * 8, columnCount, rowCount, 0);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
}
return TRUE; return TRUE;
} }
@@ -1057,7 +1060,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y)
{ {
u8 spriteId; u8 spriteId;
u8 taskId; u8 taskId;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) == TRUE) if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return TRUE; return TRUE;
if (FindTaskIdByFunc(Task_ScriptShowMonPic) != TASK_NONE) if (FindTaskIdByFunc(Task_ScriptShowMonPic) != TASK_NONE)
return FALSE; return FALSE;
@@ -1143,7 +1146,7 @@ bool8 OpenMuseumFossilPic(void)
{ {
u8 spriteId; u8 spriteId;
u8 taskId; u8 taskId;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) == TRUE) if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return TRUE; return TRUE;
if (FindTaskIdByFunc(Task_WaitMuseumFossilPic) != TASK_NONE) if (FindTaskIdByFunc(Task_WaitMuseumFossilPic) != TASK_NONE)
return FALSE; return FALSE;
@@ -1196,7 +1199,7 @@ static void DestroyScriptMenuWindow(u8 windowId)
RemoveWindow(windowId); RemoveWindow(windowId);
} }
void QLPlaybackCB_DestroyScriptMenuMonPicSprites(void) void QL_DestroyAbortedDisplay(void)
{ {
u8 taskId; u8 taskId;
s16 *data; s16 *data;
@@ -1234,8 +1237,10 @@ void DrawSeagallopDestinationMenu(void)
u8 windowId; u8 windowId;
u8 i; u8 i;
gSpecialVar_Result = SCR_MENU_UNSET; gSpecialVar_Result = SCR_MENU_UNSET;
if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE)
{ if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
return;
if (gSpecialVar_0x8005 == 1) if (gSpecialVar_0x8005 == 1)
{ {
if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND) if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND)
@@ -1275,7 +1280,6 @@ void DrawSeagallopDestinationMenu(void)
Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0); Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0);
CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE); CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
}
} }
u16 GetSelectedSeagallopDestination(void) u16 GetSelectedSeagallopDestination(void)
+48 -51
View File
@@ -69,17 +69,6 @@ struct ShopData
/*0x18*/ u16 unk18; /*0x18*/ u16 unk18;
}; };
struct MartHistory
{
/*0x00*/ u32 unk0;
/*0x04*/ u16 unk4;
/*0x06*/ u16 unk6;
/*0x08*/ u8 unk8;
/*0x09*/ u8 unk9;
/*0x0A*/ u8 unkA;
/*0x0B*/ u8 unkB;
}; /* size = 12 */
static EWRAM_DATA s16 sViewportObjectEvents[OBJECT_EVENTS_COUNT][4] = {0}; static EWRAM_DATA s16 sViewportObjectEvents[OBJECT_EVENTS_COUNT][4] = {0};
EWRAM_DATA struct ShopData gShopData = {0}; EWRAM_DATA struct ShopData gShopData = {0};
static EWRAM_DATA u8 sShopMenuWindowId = 0; static EWRAM_DATA u8 sShopMenuWindowId = 0;
@@ -89,7 +78,7 @@ EWRAM_DATA u16 (*gShopTilemapBuffer3)[0x400] = {0};
EWRAM_DATA u16 (*gShopTilemapBuffer4)[0x400] = {0}; EWRAM_DATA u16 (*gShopTilemapBuffer4)[0x400] = {0};
EWRAM_DATA struct ListMenuItem *sShopMenuListMenu = {0}; EWRAM_DATA struct ListMenuItem *sShopMenuListMenu = {0};
static EWRAM_DATA u8 (*sShopMenuItemStrings)[13] = {0}; static EWRAM_DATA u8 (*sShopMenuItemStrings)[13] = {0};
EWRAM_DATA struct MartHistory gShopMenuHistory[2] = {0}; EWRAM_DATA struct QuestLogEvent_Shop sHistory[2] = {0};
//Function Declarations //Function Declarations
static u8 CreateShopMenu(u8 a0); static u8 CreateShopMenu(u8 a0);
@@ -146,7 +135,7 @@ static void ExitBuyMenu(u8 taskId);
static void Task_ExitBuyMenu(u8 taskId); static void Task_ExitBuyMenu(u8 taskId);
static void DebugFunc_PrintPurchaseDetails(u8 taskId); static void DebugFunc_PrintPurchaseDetails(u8 taskId);
static void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void); static void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void);
static void RecordQuestLogItemPurchase(void); static void RecordTransactionForQuestLog(void);
static const struct MenuAction sShopMenuActions_BuySellQuit[] = static const struct MenuAction sShopMenuActions_BuySellQuit[] =
{ {
@@ -305,7 +294,7 @@ static void CB2_GoToSellMenu(void)
static void Task_HandleShopMenuQuit(u8 taskId) static void Task_HandleShopMenuQuit(u8 taskId)
{ {
ClearShopMenuWindow(); ClearShopMenuWindow();
RecordQuestLogItemPurchase(); RecordTransactionForQuestLog();
DestroyTask(taskId); DestroyTask(taskId);
if (gShopData.callback != NULL) if (gShopData.callback != NULL)
gShopData.callback(); gShopData.callback();
@@ -995,7 +984,7 @@ static void BuyMenuTryMakePurchase(u8 taskId)
{ {
BuyMenuDisplayMessage(taskId, gText_HereYouGoThankYou, BuyMenuSubtractMoney); BuyMenuDisplayMessage(taskId, gText_HereYouGoThankYou, BuyMenuSubtractMoney);
DebugFunc_PrintPurchaseDetails(taskId); DebugFunc_PrintPurchaseDetails(taskId);
RecordItemPurchase(tItemId, tItemCount, 1); RecordItemTransaction(tItemId, tItemCount, QL_EVENT_BOUGHT_ITEM - QL_EVENT_USED_POKEMART);
} }
else else
{ {
@@ -1066,59 +1055,67 @@ static void DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(void)
{ {
} }
void RecordItemPurchase(u16 item, u16 quantity, u8 a2) // Records a transaction during a single shopping session.
// This is for the Quest Log to save information about the player's purchases/sales when they finish.
void RecordItemTransaction(u16 itemId, u16 quantity, u8 logEventId)
{ {
struct MartHistory *history; struct QuestLogEvent_Shop *history;
if (gShopMenuHistory[0].unkA == a2) // There should only be a single entry for buying/selling respectively,
// so if one has already been created then get it first.
if (sHistory[0].logEventId == logEventId)
{ {
history = &gShopMenuHistory[0]; history = &sHistory[0];
} }
else if (gShopMenuHistory[1].unkA == a2) else if (sHistory[1].logEventId == logEventId)
{ {
history = &gShopMenuHistory[1]; history = &sHistory[1];
} }
else else
{ {
if (gShopMenuHistory[0].unkA == 0) // First transaction of this type, save it in an empty slot
history = &gShopMenuHistory[0]; if (sHistory[0].logEventId == 0)
history = &sHistory[0];
else else
history = &gShopMenuHistory[1]; history = &sHistory[1];
history->unkA = a2; history->logEventId = logEventId;
} }
if (history->unk4 != 0) // Set flag if this isn't the first time we've bought/sold in this session
if (history->lastItemId != ITEM_NONE)
history->hasMultipleTransactions = TRUE;
history->lastItemId = itemId;
// Add to number of items bought/sold
if (history->itemQuantity < 999)
{ {
history->unk9 = 1; history->itemQuantity += quantity;
if (history->itemQuantity > 999)
history->itemQuantity = 999;
} }
history->unk4 = item; // Add to amount of money spent buying or earned selling
if (history->unk6 < 999) if (history->totalMoney < 999999)
{ {
history->unk6 += quantity; // logEventId will either be 1 (bought) or 2 (sold)
if (history->unk6 > 999) // so for buying it will add the full price and selling will add half price
history->unk6 = 999; history->totalMoney += (ItemId_GetPrice(itemId) >> (logEventId - 1)) * quantity;
} if (history->totalMoney > 999999)
history->totalMoney = 999999;
if (history->unk0 < 999999)
{
history->unk0 += (ItemId_GetPrice(item) >> (a2 - 1)) * quantity;
if (history->unk0 > 999999)
history->unk0 = 999999;
} }
} }
static void RecordQuestLogItemPurchase(void) // Will record QL_EVENT_BOUGHT_ITEM and/or QL_EVENT_SOLD_ITEM, or nothing.
static void RecordTransactionForQuestLog(void)
{ {
u16 v; u16 eventId = sHistory[0].logEventId;
if (eventId != 0)
SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[0]);
v = gShopMenuHistory[0].unkA; eventId = sHistory[1].logEventId;
if (v != 0) if (eventId != 0)
SetQuestLogEvent(v + QL_EVENT_USED_POKEMART, (const u16 *)&gShopMenuHistory[0]); SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[1]);
v = gShopMenuHistory[1].unkA;
if (v != 0)
SetQuestLogEvent(v + QL_EVENT_USED_POKEMART, (const u16 *)&gShopMenuHistory[1]);
} }
void CreatePokemartMenu(const u16 *itemsForSale) void CreatePokemartMenu(const u16 *itemsForSale)
@@ -1127,9 +1124,9 @@ void CreatePokemartMenu(const u16 *itemsForSale)
CreateShopMenu(MART_TYPE_REGULAR); CreateShopMenu(MART_TYPE_REGULAR);
SetShopMenuCallback(ScriptContext_Enable); SetShopMenuCallback(ScriptContext_Enable);
DebugFunc_PrintShopMenuHistoryBeforeClearMaybe(); DebugFunc_PrintShopMenuHistoryBeforeClearMaybe();
memset(&gShopMenuHistory, 0, sizeof(gShopMenuHistory)); memset(&sHistory, 0, sizeof(sHistory));
gShopMenuHistory[0].unk8 = gMapHeader.regionMapSectionId; sHistory[0].mapSec = gMapHeader.regionMapSectionId;
gShopMenuHistory[1].unk8 = gMapHeader.regionMapSectionId; sHistory[1].mapSec = gMapHeader.regionMapSectionId;
} }
void CreateDecorationShop1Menu(const u16 *itemsForSale) void CreateDecorationShop1Menu(const u16 *itemsForSale)
+2 -1
View File
@@ -23,6 +23,7 @@
#include "menu_indicators.h" #include "menu_indicators.h"
#include "constants/items.h" #include "constants/items.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/quest_log.h"
// Any item in the TM Case with nonzero importance is considered an HM // Any item in the TM Case with nonzero importance is considered an HM
#define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0) #define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0)
@@ -1292,7 +1293,7 @@ static void Task_DoSaleOfTMs(u8 taskId)
PlaySE(SE_SHOP); PlaySE(SE_SHOP);
RemoveBagItem(gSpecialVar_ItemId, tQuantitySelected); RemoveBagItem(gSpecialVar_ItemId, tQuantitySelected);
AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * tQuantitySelected); AddMoney(&gSaveBlock1Ptr->money, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * tQuantitySelected);
RecordItemPurchase(gSpecialVar_ItemId, tQuantitySelected, 2); RecordItemTransaction(gSpecialVar_ItemId, tQuantitySelected, QL_EVENT_SOLD_ITEM - QL_EVENT_USED_POKEMART);
DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); DestroyListMenuTask(tListTaskId, &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
TMCaseSetup_GetTMCount(); TMCaseSetup_GetTMCount();
TMCaseSetup_InitListMenuPositions(); TMCaseSetup_InitListMenuPositions();
+6 -8
View File
@@ -107,9 +107,7 @@ struct {
/*0xF0*/ u16 monSpecies[2]; /*0xF0*/ u16 monSpecies[2];
/*0xF4*/ u16 cachedMapMusic; /*0xF4*/ u16 cachedMapMusic;
/*0xF6*/ u8 unk_F6; /*0xF6*/ u8 unk_F6;
/*0xF8*/ u16 questLogSpecies[2]; /*0xF8*/ struct QuestLogEvent_Traded questLogData;
/*0xFC*/ u8 linkPartnerName[7];
/*0x103*/ u8 filler_103[1];
/*0x104*/ u8 textColor[3]; /*0x104*/ u8 textColor[3];
/*0x107*/ u8 filler_107[1]; /*0x107*/ u8 filler_107[1];
/*0x108*/ bool8 isCableTrade; /*0x108*/ bool8 isCableTrade;
@@ -883,9 +881,9 @@ void CB2_LinkTrade(void)
case 10: case 10:
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
ShowBg(0); ShowBg(0);
sTradeAnim->questLogSpecies[TRADE_PLAYER] = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_SPECIES_OR_EGG); sTradeAnim->questLogData.speciesSent = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_SPECIES_OR_EGG);
sTradeAnim->questLogSpecies[TRADE_PARTNER] = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_SPECIES_OR_EGG); sTradeAnim->questLogData.speciesReceived = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_SPECIES_OR_EGG);
memcpy(sTradeAnim->linkPartnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH); memcpy(sTradeAnim->questLogData.partnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH);
gMain.state++; gMain.state++;
break; break;
case 11: case 11:
@@ -2599,11 +2597,11 @@ static void CB2_SaveAndEndTrade(void)
case 50: case 50:
if (InUnionRoom()) if (InUnionRoom())
{ {
SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, sTradeAnim->questLogSpecies); SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, (void *)&sTradeAnim->questLogData);
} }
else else
{ {
SetQuestLogEvent(QL_EVENT_LINK_TRADED, sTradeAnim->questLogSpecies); SetQuestLogEvent(QL_EVENT_LINK_TRADED, (void *)&sTradeAnim->questLogData);
IncrementGameStat(GAME_STAT_POKEMON_TRADES); IncrementGameStat(GAME_STAT_POKEMON_TRADES);
} }
if (gWirelessCommType) if (gWirelessCommType)
+1 -11
View File
@@ -4,6 +4,7 @@
#include "event_data.h" #include "event_data.h"
#include "event_scripts.h" #include "event_scripts.h"
#include "random.h" #include "random.h"
#include "constants/trainer_fan_club.h"
struct TrainerFanClub struct TrainerFanClub
{ {
@@ -18,17 +19,6 @@ struct TrainerFanClub
#define SET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags |= 1 << (flag)) #define SET_TRAINER_FAN_CLUB_FLAG(flag) (fanClub->fanFlags |= 1 << (flag))
#define FLIP_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 TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *);
static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *); static void UpdateTrainerFanClubGameClear(struct TrainerFanClub *);
static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *); static u8 PlayerGainRandomTrainerFan(struct TrainerFanClub *);
+1 -1
View File
@@ -88,7 +88,7 @@ static const TrainerSeeFunc sTrainerSeeFuncList2[] = {
bool8 CheckForTrainersWantingBattle(void) bool8 CheckForTrainersWantingBattle(void)
{ {
u8 i; u8 i;
if (sub_8111C2C() == TRUE) if (QL_IsTrainerSightDisabled() == TRUE)
return FALSE; return FALSE;
for (i = 0; i < OBJECT_EVENTS_COUNT; i++) for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+353 -350
View File
@@ -26,6 +26,13 @@
#include "constants/quest_log.h" #include "constants/quest_log.h"
#include "constants/trainer_types.h" #include "constants/trainer_types.h"
// Each trainer can have up to 6 parties, including their original party.
// Each rematch is unavailable until the player has progressed to a certain point in the story (see TryGetRematchTrainerIdGivenGameState).
// A list of the trainer ids for each party is in sRematches. If a party doesn't update for a progression point it will have SKIP instead,
// and that trainer id will be ignored.
#define MAX_REMATCH_PARTIES 6
#define SKIP 0xFFFF
enum enum
{ {
VSSEEKER_NOT_CHARGED, VSSEEKER_NOT_CHARGED,
@@ -47,13 +54,12 @@ typedef enum
VSSEEKER_RESPONSE_FOUND_REMATCHES VSSEEKER_RESPONSE_FOUND_REMATCHES
} VsSeekerResponseCode; } VsSeekerResponseCode;
// static types struct RematchData
typedef struct VsSeekerData
{ {
u16 trainerIdxs[6]; u16 trainerIdxs[MAX_REMATCH_PARTIES];
u16 mapGroup; // unused u16 mapGroup; // unused
u16 mapNum; // unused u16 mapNum; // unused
} VsSeekerData; };
struct VsSeekerTrainerInfo struct VsSeekerTrainerInfo
{ {
@@ -91,19 +97,19 @@ static void Task_VsSeeker_2(u8 taskId);
static void GatherNearbyTrainerInfo(void); static void GatherNearbyTrainerInfo(void);
static void Task_VsSeeker_3(u8 taskId); static void Task_VsSeeker_3(u8 taskId);
static bool8 CanUseVsSeeker(void); static bool8 CanUseVsSeeker(void);
static u8 GetVsSeekerResponseInArea(const VsSeekerData * vsSeekerData); static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData);
static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx); static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx);
static u8 ShouldTryRematchBattleInternal(const VsSeekerData * vsSeekerData, u16 trainerBattleOpponent); static u8 ShouldTryRematchBattleInternal(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);
static u8 HasRematchTrainerAlreadyBeenFought(const VsSeekerData * vsSeekerData, u16 trainerBattleOpponent); static u8 HasRematchTrainerAlreadyBeenFought(const struct RematchData * vsSeekerData, u16 trainerBattleOpponent);
static int LookupVsSeekerOpponentInArray(const VsSeekerData * array, u16 trainerId); static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId);
static bool8 IsTrainerReadyForRematchInternal(const VsSeekerData * array, u16 trainerIdx); static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerIdx);
static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId); static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId);
static u16 GetTrainerFlagFromScript(const u8 * script); static u16 GetTrainerFlagFromScript(const u8 * script);
static int GetRematchIdx(const VsSeekerData * vsSeekerData, u16 trainerFlagIdx); static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx);
static bool32 IsThisTrainerRematchable(u32 localId); static bool32 IsThisTrainerRematchable(u32 localId);
static void ClearAllTrainerRematchStates(void); static void ClearAllTrainerRematchStates(void);
static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo); static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo);
static u8 GetNextAvailableRematchTrainer(const VsSeekerData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr); static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr);
static u8 GetRematchableTrainerLocalId(void); static u8 GetRematchableTrainerLocalId(void);
static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script); static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script);
static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx); static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx);
@@ -111,450 +117,447 @@ static void StartAllRespondantIdleMovements(void);
static bool8 ObjectEventIdIsSane(u8 objectEventId); static bool8 ObjectEventIdIsSane(u8 objectEventId);
static u8 GetRandomFaceDirectionMovementType(); static u8 GetRandomFaceDirectionMovementType();
// rodata static const struct RematchData sRematches[] = {
static const VsSeekerData sVsSeekerData[] = { { {TRAINER_YOUNGSTER_BEN, TRAINER_YOUNGSTER_BEN_2, SKIP, TRAINER_YOUNGSTER_BEN_3, TRAINER_YOUNGSTER_BEN_4}, MAP(ROUTE3) },
{ {TRAINER_YOUNGSTER_BEN, TRAINER_YOUNGSTER_BEN_2, 0xFFFF, TRAINER_YOUNGSTER_BEN_3, TRAINER_YOUNGSTER_BEN_4}, { {TRAINER_YOUNGSTER_CALVIN, TRAINER_YOUNGSTER_CALVIN}, MAP(ROUTE3) },
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, { {TRAINER_BUG_CATCHER_COLTON, TRAINER_BUG_CATCHER_COLTON_2, SKIP, TRAINER_BUG_CATCHER_COLTON_3, SKIP, TRAINER_BUG_CATCHER_COLTON_4},
{ {TRAINER_YOUNGSTER_CALVIN, TRAINER_YOUNGSTER_CALVIN}, MAP(ROUTE3) },
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) },
{ {TRAINER_BUG_CATCHER_COLTON, TRAINER_BUG_CATCHER_COLTON_2, 0xFFFF, TRAINER_BUG_CATCHER_COLTON_3, 0xFFFF, TRAINER_BUG_CATCHER_COLTON_4},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) },
{ {TRAINER_BUG_CATCHER_GREG, TRAINER_BUG_CATCHER_GREG}, { {TRAINER_BUG_CATCHER_GREG, TRAINER_BUG_CATCHER_GREG},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, MAP(ROUTE3) },
{ {TRAINER_BUG_CATCHER_JAMES, TRAINER_BUG_CATCHER_JAMES}, { {TRAINER_BUG_CATCHER_JAMES, TRAINER_BUG_CATCHER_JAMES},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, MAP(ROUTE3) },
{ {TRAINER_LASS_JANICE, TRAINER_LASS_JANICE_2, 0xFFFF, TRAINER_LASS_JANICE_3}, { {TRAINER_LASS_JANICE, TRAINER_LASS_JANICE_2, SKIP, TRAINER_LASS_JANICE_3},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, MAP(ROUTE3) },
{ {TRAINER_LASS_SALLY, TRAINER_LASS_SALLY}, { {TRAINER_LASS_SALLY, TRAINER_LASS_SALLY},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, MAP(ROUTE3) },
{ {TRAINER_LASS_ROBIN, TRAINER_LASS_ROBIN}, { {TRAINER_LASS_ROBIN, TRAINER_LASS_ROBIN},
MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3) }, MAP(ROUTE3) },
{ {TRAINER_LASS_CRISSY, TRAINER_LASS_CRISSY}, { {TRAINER_LASS_CRISSY, TRAINER_LASS_CRISSY},
MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4) }, MAP(ROUTE4) },
{ {TRAINER_YOUNGSTER_TIMMY, TRAINER_YOUNGSTER_TIMMY_2, 0xFFFF, TRAINER_YOUNGSTER_TIMMY_3, 0xFFFF, TRAINER_YOUNGSTER_TIMMY_4}, { {TRAINER_YOUNGSTER_TIMMY, TRAINER_YOUNGSTER_TIMMY_2, SKIP, TRAINER_YOUNGSTER_TIMMY_3, SKIP, TRAINER_YOUNGSTER_TIMMY_4},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_BUG_CATCHER_CALE, TRAINER_BUG_CATCHER_CALE}, { {TRAINER_BUG_CATCHER_CALE, TRAINER_BUG_CATCHER_CALE},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_LASS_RELI, TRAINER_LASS_RELI_2, 0xFFFF, TRAINER_LASS_RELI_3}, { {TRAINER_LASS_RELI, TRAINER_LASS_RELI_2, SKIP, TRAINER_LASS_RELI_3},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_LASS_ALI, TRAINER_LASS_ALI}, { {TRAINER_LASS_ALI, TRAINER_LASS_ALI},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_CAMPER_SHANE, TRAINER_CAMPER_SHANE}, { {TRAINER_CAMPER_SHANE, TRAINER_CAMPER_SHANE},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_CAMPER_ETHAN, TRAINER_CAMPER_ETHAN}, { {TRAINER_CAMPER_ETHAN, TRAINER_CAMPER_ETHAN},
MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24) }, MAP(ROUTE24) },
{ {TRAINER_YOUNGSTER_JOEY, TRAINER_YOUNGSTER_JOEY}, { {TRAINER_YOUNGSTER_JOEY, TRAINER_YOUNGSTER_JOEY},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_YOUNGSTER_DAN, TRAINER_YOUNGSTER_DAN}, { {TRAINER_YOUNGSTER_DAN, TRAINER_YOUNGSTER_DAN},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_YOUNGSTER_CHAD, TRAINER_YOUNGSTER_CHAD_2, 0xFFFF, TRAINER_YOUNGSTER_CHAD_3, TRAINER_YOUNGSTER_CHAD_4}, { {TRAINER_YOUNGSTER_CHAD, TRAINER_YOUNGSTER_CHAD_2, SKIP, TRAINER_YOUNGSTER_CHAD_3, TRAINER_YOUNGSTER_CHAD_4},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_PICNICKER_KELSEY, TRAINER_PICNICKER_KELSEY_2, 0xFFFF, TRAINER_PICNICKER_KELSEY_3, TRAINER_PICNICKER_KELSEY_4}, { {TRAINER_PICNICKER_KELSEY, TRAINER_PICNICKER_KELSEY_2, SKIP, TRAINER_PICNICKER_KELSEY_3, TRAINER_PICNICKER_KELSEY_4},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_LASS_HALEY, TRAINER_LASS_HALEY}, { {TRAINER_LASS_HALEY, TRAINER_LASS_HALEY},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_HIKER_FRANKLIN, 0xFFFF, TRAINER_HIKER_FRANKLIN_2}, { {TRAINER_HIKER_FRANKLIN, SKIP, TRAINER_HIKER_FRANKLIN_2},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_HIKER_NOB, TRAINER_HIKER_NOB}, { {TRAINER_HIKER_NOB, TRAINER_HIKER_NOB},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_HIKER_WAYNE, TRAINER_HIKER_WAYNE}, { {TRAINER_HIKER_WAYNE, TRAINER_HIKER_WAYNE},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_CAMPER_FLINT, TRAINER_CAMPER_FLINT}, { {TRAINER_CAMPER_FLINT, TRAINER_CAMPER_FLINT},
MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) }, MAP(ROUTE25) },
{ {TRAINER_BUG_CATCHER_KEIGO, TRAINER_BUG_CATCHER_KEIGO}, { {TRAINER_BUG_CATCHER_KEIGO, TRAINER_BUG_CATCHER_KEIGO},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_BUG_CATCHER_ELIJAH, TRAINER_BUG_CATCHER_ELIJAH}, { {TRAINER_BUG_CATCHER_ELIJAH, TRAINER_BUG_CATCHER_ELIJAH},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_CAMPER_RICKY, TRAINER_CAMPER_RICKY_2, 0xFFFF, TRAINER_CAMPER_RICKY_3, 0xFFFF, TRAINER_CAMPER_RICKY_4}, { {TRAINER_CAMPER_RICKY, TRAINER_CAMPER_RICKY_2, SKIP, TRAINER_CAMPER_RICKY_3, SKIP, TRAINER_CAMPER_RICKY_4},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_CAMPER_JEFF, TRAINER_CAMPER_JEFF_2, 0xFFFF, TRAINER_CAMPER_JEFF_3, 0xFFFF, TRAINER_CAMPER_JEFF_4}, { {TRAINER_CAMPER_JEFF, TRAINER_CAMPER_JEFF_2, SKIP, TRAINER_CAMPER_JEFF_3, SKIP, TRAINER_CAMPER_JEFF_4},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_PICNICKER_NANCY, TRAINER_PICNICKER_NANCY}, { {TRAINER_PICNICKER_NANCY, TRAINER_PICNICKER_NANCY},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_PICNICKER_ISABELLE, TRAINER_PICNICKER_ISABELLE_2, 0xFFFF, TRAINER_PICNICKER_ISABELLE_3, TRAINER_PICNICKER_ISABELLE_4}, { {TRAINER_PICNICKER_ISABELLE, TRAINER_PICNICKER_ISABELLE_2, SKIP, TRAINER_PICNICKER_ISABELLE_3, TRAINER_PICNICKER_ISABELLE_4},
MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6) }, MAP(ROUTE6) },
{ {TRAINER_YOUNGSTER_EDDIE, TRAINER_YOUNGSTER_EDDIE}, { {TRAINER_YOUNGSTER_EDDIE, TRAINER_YOUNGSTER_EDDIE},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_YOUNGSTER_DILLON, TRAINER_YOUNGSTER_DILLON}, { {TRAINER_YOUNGSTER_DILLON, TRAINER_YOUNGSTER_DILLON},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_YOUNGSTER_YASU, 0xFFFF, TRAINER_YOUNGSTER_YASU_2, 0xFFFF, TRAINER_YOUNGSTER_YASU_3}, { {TRAINER_YOUNGSTER_YASU, SKIP, TRAINER_YOUNGSTER_YASU_2, SKIP, TRAINER_YOUNGSTER_YASU_3},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_YOUNGSTER_DAVE, TRAINER_YOUNGSTER_DAVE}, { {TRAINER_YOUNGSTER_DAVE, TRAINER_YOUNGSTER_DAVE},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_ENGINEER_BRAXTON, TRAINER_ENGINEER_BRAXTON}, { {TRAINER_ENGINEER_BRAXTON, TRAINER_ENGINEER_BRAXTON},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_ENGINEER_BERNIE, 0xFFFF, 0xFFFF, TRAINER_ENGINEER_BERNIE_2}, { {TRAINER_ENGINEER_BERNIE, SKIP, SKIP, TRAINER_ENGINEER_BERNIE_2},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_GAMER_HUGO, TRAINER_GAMER_HUGO}, { {TRAINER_GAMER_HUGO, TRAINER_GAMER_HUGO},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_GAMER_JASPER, TRAINER_GAMER_JASPER}, { {TRAINER_GAMER_JASPER, TRAINER_GAMER_JASPER},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_GAMER_DIRK, TRAINER_GAMER_DIRK}, { {TRAINER_GAMER_DIRK, TRAINER_GAMER_DIRK},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_GAMER_DARIAN, 0xFFFF, 0xFFFF, TRAINER_GAMER_DARIAN_2}, { {TRAINER_GAMER_DARIAN, SKIP, SKIP, TRAINER_GAMER_DARIAN_2},
MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11) }, MAP(ROUTE11) },
{ {TRAINER_BUG_CATCHER_BRENT, TRAINER_BUG_CATCHER_BRENT}, { {TRAINER_BUG_CATCHER_BRENT, TRAINER_BUG_CATCHER_BRENT},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_BUG_CATCHER_CONNER, TRAINER_BUG_CATCHER_CONNER}, { {TRAINER_BUG_CATCHER_CONNER, TRAINER_BUG_CATCHER_CONNER},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_CAMPER_CHRIS, 0xFFFF, TRAINER_CAMPER_CHRIS_2, TRAINER_CAMPER_CHRIS_3, 0xFFFF, TRAINER_CAMPER_CHRIS_4}, { {TRAINER_CAMPER_CHRIS, SKIP, TRAINER_CAMPER_CHRIS_2, TRAINER_CAMPER_CHRIS_3, SKIP, TRAINER_CAMPER_CHRIS_4},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_CAMPER_DREW, TRAINER_CAMPER_DREW}, { {TRAINER_CAMPER_DREW, TRAINER_CAMPER_DREW},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_PICNICKER_ALICIA, 0xFFFF, TRAINER_PICNICKER_ALICIA_2, TRAINER_PICNICKER_ALICIA_3, 0xFFFF, TRAINER_PICNICKER_ALICIA_4}, { {TRAINER_PICNICKER_ALICIA, SKIP, TRAINER_PICNICKER_ALICIA_2, TRAINER_PICNICKER_ALICIA_3, SKIP, TRAINER_PICNICKER_ALICIA_4},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_PICNICKER_CAITLIN, TRAINER_PICNICKER_CAITLIN}, { {TRAINER_PICNICKER_CAITLIN, TRAINER_PICNICKER_CAITLIN},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_HIKER_ALAN, TRAINER_HIKER_ALAN}, { {TRAINER_HIKER_ALAN, TRAINER_HIKER_ALAN},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_HIKER_BRICE, TRAINER_HIKER_BRICE}, { {TRAINER_HIKER_BRICE, TRAINER_HIKER_BRICE},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_HIKER_JEREMY, 0xFFFF, 0xFFFF, TRAINER_HIKER_JEREMY_2}, { {TRAINER_HIKER_JEREMY, SKIP, SKIP, TRAINER_HIKER_JEREMY_2},
MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9) }, MAP(ROUTE9) },
{ {TRAINER_PICNICKER_HEIDI, TRAINER_PICNICKER_HEIDI}, { {TRAINER_PICNICKER_HEIDI, TRAINER_PICNICKER_HEIDI},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_PICNICKER_CAROL, TRAINER_PICNICKER_CAROL}, { {TRAINER_PICNICKER_CAROL, TRAINER_PICNICKER_CAROL},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_POKEMANIAC_MARK, 0xFFFF, 0xFFFF, TRAINER_POKEMANIAC_MARK_2, 0xFFFF, TRAINER_POKEMANIAC_MARK_3}, { {TRAINER_POKEMANIAC_MARK, SKIP, SKIP, TRAINER_POKEMANIAC_MARK_2, SKIP, TRAINER_POKEMANIAC_MARK_3},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_POKEMANIAC_HERMAN, 0xFFFF, 0xFFFF, TRAINER_POKEMANIAC_HERMAN_2, 0xFFFF, TRAINER_POKEMANIAC_HERMAN_3}, { {TRAINER_POKEMANIAC_HERMAN, SKIP, SKIP, TRAINER_POKEMANIAC_HERMAN_2, SKIP, TRAINER_POKEMANIAC_HERMAN_3},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_HIKER_CLARK, TRAINER_HIKER_CLARK}, { {TRAINER_HIKER_CLARK, TRAINER_HIKER_CLARK},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_HIKER_TRENT, 0xFFFF, 0xFFFF, TRAINER_HIKER_TRENT_2}, { {TRAINER_HIKER_TRENT, SKIP, SKIP, TRAINER_HIKER_TRENT_2},
MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) }, MAP(ROUTE10) },
{ {TRAINER_LASS_PAIGE, TRAINER_LASS_PAIGE}, { {TRAINER_LASS_PAIGE, TRAINER_LASS_PAIGE},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_LASS_ANDREA, TRAINER_LASS_ANDREA}, { {TRAINER_LASS_ANDREA, TRAINER_LASS_ANDREA},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_LASS_MEGAN, 0xFFFF, TRAINER_LASS_MEGAN_2, 0xFFFF, TRAINER_LASS_MEGAN_3}, { {TRAINER_LASS_MEGAN, SKIP, TRAINER_LASS_MEGAN_2, SKIP, TRAINER_LASS_MEGAN_3},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_LASS_JULIA, TRAINER_LASS_JULIA}, { {TRAINER_LASS_JULIA, TRAINER_LASS_JULIA},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_SUPER_NERD_AIDAN, TRAINER_SUPER_NERD_AIDAN}, { {TRAINER_SUPER_NERD_AIDAN, TRAINER_SUPER_NERD_AIDAN},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_SUPER_NERD_GLENN, 0xFFFF, 0xFFFF, TRAINER_SUPER_NERD_GLENN_2}, { {TRAINER_SUPER_NERD_GLENN, SKIP, SKIP, TRAINER_SUPER_NERD_GLENN_2},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_SUPER_NERD_LESLIE, TRAINER_SUPER_NERD_LESLIE}, { {TRAINER_SUPER_NERD_LESLIE, TRAINER_SUPER_NERD_LESLIE},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_GAMER_STAN, TRAINER_GAMER_STAN}, { {TRAINER_GAMER_STAN, TRAINER_GAMER_STAN},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_GAMER_RICH, 0xFFFF, 0xFFFF, TRAINER_GAMER_RICH_2}, { {TRAINER_GAMER_RICH, SKIP, SKIP, TRAINER_GAMER_RICH_2},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_TWINS_ELI_ANNE, 0xFFFF, 0xFFFF, TRAINER_TWINS_ELI_ANNE_2}, { {TRAINER_TWINS_ELI_ANNE, SKIP, SKIP, TRAINER_TWINS_ELI_ANNE_2},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_BIKER_RICARDO, TRAINER_BIKER_RICARDO}, { {TRAINER_BIKER_RICARDO, TRAINER_BIKER_RICARDO},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_BIKER_JAREN, 0xFFFF, 0xFFFF, TRAINER_BIKER_JAREN_2}, { {TRAINER_BIKER_JAREN, SKIP, SKIP, TRAINER_BIKER_JAREN_2},
MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8) }, MAP(ROUTE8) },
{ {TRAINER_FISHERMAN_NED, TRAINER_FISHERMAN_NED}, { {TRAINER_FISHERMAN_NED, TRAINER_FISHERMAN_NED},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_FISHERMAN_CHIP, TRAINER_FISHERMAN_CHIP}, { {TRAINER_FISHERMAN_CHIP, TRAINER_FISHERMAN_CHIP},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_FISHERMAN_HANK, TRAINER_FISHERMAN_HANK}, { {TRAINER_FISHERMAN_HANK, TRAINER_FISHERMAN_HANK},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_FISHERMAN_ELLIOT, 0xFFFF, 0xFFFF, TRAINER_FISHERMAN_ELLIOT_2}, { {TRAINER_FISHERMAN_ELLIOT, SKIP, SKIP, TRAINER_FISHERMAN_ELLIOT_2},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_FISHERMAN_ANDREW, TRAINER_FISHERMAN_ANDREW}, { {TRAINER_FISHERMAN_ANDREW, TRAINER_FISHERMAN_ANDREW},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_ROCKER_LUCA, 0xFFFF, 0xFFFF, TRAINER_ROCKER_LUCA_2}, { {TRAINER_ROCKER_LUCA, SKIP, SKIP, TRAINER_ROCKER_LUCA_2},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_CAMPER_JUSTIN, TRAINER_CAMPER_JUSTIN}, { {TRAINER_CAMPER_JUSTIN, TRAINER_CAMPER_JUSTIN},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_YOUNG_COUPLE_GIA_JES, 0xFFFF, 0xFFFF, TRAINER_YOUNG_COUPLE_GIA_JES_2, 0xFFFF, TRAINER_YOUNG_COUPLE_GIA_JES_3}, { {TRAINER_YOUNG_COUPLE_GIA_JES, SKIP, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_2, SKIP, TRAINER_YOUNG_COUPLE_GIA_JES_3},
MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12) }, MAP(ROUTE12) },
{ {TRAINER_BIKER_JARED, TRAINER_BIKER_JARED}, { {TRAINER_BIKER_JARED, TRAINER_BIKER_JARED},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BEAUTY_LOLA, TRAINER_BEAUTY_LOLA}, { {TRAINER_BEAUTY_LOLA, TRAINER_BEAUTY_LOLA},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BEAUTY_SHEILA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BEAUTY_SHEILA_2}, { {TRAINER_BEAUTY_SHEILA, SKIP, SKIP, SKIP, TRAINER_BEAUTY_SHEILA_2},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BIRD_KEEPER_SEBASTIAN, TRAINER_BIRD_KEEPER_SEBASTIAN}, { {TRAINER_BIRD_KEEPER_SEBASTIAN, TRAINER_BIRD_KEEPER_SEBASTIAN},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BIRD_KEEPER_PERRY, TRAINER_BIRD_KEEPER_PERRY}, { {TRAINER_BIRD_KEEPER_PERRY, TRAINER_BIRD_KEEPER_PERRY},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BIRD_KEEPER_ROBERT, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_ROBERT_2, TRAINER_BIRD_KEEPER_ROBERT_3}, { {TRAINER_BIRD_KEEPER_ROBERT, SKIP, SKIP, TRAINER_BIRD_KEEPER_ROBERT_2, TRAINER_BIRD_KEEPER_ROBERT_3},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_PICNICKER_ALMA, TRAINER_PICNICKER_ALMA}, { {TRAINER_PICNICKER_ALMA, TRAINER_PICNICKER_ALMA},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_PICNICKER_SUSIE, 0xFFFF, 0xFFFF, TRAINER_PICNICKER_SUSIE_2, TRAINER_PICNICKER_SUSIE_3, TRAINER_PICNICKER_SUSIE_4}, { {TRAINER_PICNICKER_SUSIE, SKIP, SKIP, TRAINER_PICNICKER_SUSIE_2, TRAINER_PICNICKER_SUSIE_3, TRAINER_PICNICKER_SUSIE_4},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_PICNICKER_VALERIE, TRAINER_PICNICKER_VALERIE}, { {TRAINER_PICNICKER_VALERIE, TRAINER_PICNICKER_VALERIE},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_PICNICKER_GWEN, TRAINER_PICNICKER_GWEN}, { {TRAINER_PICNICKER_GWEN, TRAINER_PICNICKER_GWEN},
MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13) }, MAP(ROUTE13) },
{ {TRAINER_BIKER_MALIK, TRAINER_BIKER_MALIK}, { {TRAINER_BIKER_MALIK, TRAINER_BIKER_MALIK},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIKER_LUKAS, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIKER_LUKAS_2}, { {TRAINER_BIKER_LUKAS, SKIP, SKIP, SKIP, TRAINER_BIKER_LUKAS_2},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIKER_ISAAC, TRAINER_BIKER_ISAAC}, { {TRAINER_BIKER_ISAAC, TRAINER_BIKER_ISAAC},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIKER_GERALD, TRAINER_BIKER_GERALD}, { {TRAINER_BIKER_GERALD, TRAINER_BIKER_GERALD},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_DONALD, TRAINER_BIRD_KEEPER_DONALD}, { {TRAINER_BIRD_KEEPER_DONALD, TRAINER_BIRD_KEEPER_DONALD},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_BENNY, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_BENNY_2, TRAINER_BIRD_KEEPER_BENNY_3}, { {TRAINER_BIRD_KEEPER_BENNY, SKIP, SKIP, TRAINER_BIRD_KEEPER_BENNY_2, TRAINER_BIRD_KEEPER_BENNY_3},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_CARTER, TRAINER_BIRD_KEEPER_CARTER}, { {TRAINER_BIRD_KEEPER_CARTER, TRAINER_BIRD_KEEPER_CARTER},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_MITCH, TRAINER_BIRD_KEEPER_MITCH}, { {TRAINER_BIRD_KEEPER_MITCH, TRAINER_BIRD_KEEPER_MITCH},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_BECK, TRAINER_BIRD_KEEPER_BECK}, { {TRAINER_BIRD_KEEPER_BECK, TRAINER_BIRD_KEEPER_BECK},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIRD_KEEPER_MARLON, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_MARLON_2, TRAINER_BIRD_KEEPER_MARLON_3}, { {TRAINER_BIRD_KEEPER_MARLON, SKIP, SKIP, TRAINER_BIRD_KEEPER_MARLON_2, TRAINER_BIRD_KEEPER_MARLON_3},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_TWINS_KIRI_JAN, TRAINER_TWINS_KIRI_JAN}, { {TRAINER_TWINS_KIRI_JAN, TRAINER_TWINS_KIRI_JAN},
MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14) }, MAP(ROUTE14) },
{ {TRAINER_BIKER_ERNEST, TRAINER_BIKER_ERNEST}, { {TRAINER_BIKER_ERNEST, TRAINER_BIKER_ERNEST},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BIKER_ALEX, TRAINER_BIKER_ALEX}, { {TRAINER_BIKER_ALEX, TRAINER_BIKER_ALEX},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BEAUTY_GRACE, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BEAUTY_GRACE_2}, { {TRAINER_BEAUTY_GRACE, SKIP, SKIP, SKIP, TRAINER_BEAUTY_GRACE_2},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BEAUTY_OLIVIA, TRAINER_BEAUTY_OLIVIA}, { {TRAINER_BEAUTY_OLIVIA, TRAINER_BEAUTY_OLIVIA},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BIRD_KEEPER_EDWIN, TRAINER_BIRD_KEEPER_EDWIN}, { {TRAINER_BIRD_KEEPER_EDWIN, TRAINER_BIRD_KEEPER_EDWIN},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BIRD_KEEPER_CHESTER, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_CHESTER_2, TRAINER_BIRD_KEEPER_CHESTER_3}, { {TRAINER_BIRD_KEEPER_CHESTER, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHESTER_2, TRAINER_BIRD_KEEPER_CHESTER_3},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_PICNICKER_YAZMIN, TRAINER_PICNICKER_YAZMIN}, { {TRAINER_PICNICKER_YAZMIN, TRAINER_PICNICKER_YAZMIN},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_PICNICKER_KINDRA, TRAINER_PICNICKER_KINDRA}, { {TRAINER_PICNICKER_KINDRA, TRAINER_PICNICKER_KINDRA},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_PICNICKER_BECKY, 0xFFFF, 0xFFFF, TRAINER_PICNICKER_BECKY_2, TRAINER_PICNICKER_BECKY_3, TRAINER_PICNICKER_BECKY_4}, { {TRAINER_PICNICKER_BECKY, SKIP, SKIP, TRAINER_PICNICKER_BECKY_2, TRAINER_PICNICKER_BECKY_3, TRAINER_PICNICKER_BECKY_4},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_PICNICKER_CELIA, TRAINER_PICNICKER_CELIA}, { {TRAINER_PICNICKER_CELIA, TRAINER_PICNICKER_CELIA},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_CRUSH_KIN_RON_MYA, 0xFFFF, 0xFFFF, TRAINER_CRUSH_KIN_RON_MYA_2, TRAINER_CRUSH_KIN_RON_MYA_3, TRAINER_CRUSH_KIN_RON_MYA_4}, { {TRAINER_CRUSH_KIN_RON_MYA, SKIP, SKIP, TRAINER_CRUSH_KIN_RON_MYA_2, TRAINER_CRUSH_KIN_RON_MYA_3, TRAINER_CRUSH_KIN_RON_MYA_4},
MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15) }, MAP(ROUTE15) },
{ {TRAINER_BIKER_LAO, TRAINER_BIKER_LAO}, { {TRAINER_BIKER_LAO, TRAINER_BIKER_LAO},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_BIKER_HIDEO, TRAINER_BIKER_HIDEO}, { {TRAINER_BIKER_HIDEO, TRAINER_BIKER_HIDEO},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_BIKER_RUBEN, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIKER_RUBEN_2}, { {TRAINER_BIKER_RUBEN, SKIP, SKIP, SKIP, TRAINER_BIKER_RUBEN_2},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_CUE_BALL_KOJI, TRAINER_CUE_BALL_KOJI}, { {TRAINER_CUE_BALL_KOJI, TRAINER_CUE_BALL_KOJI},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_CUE_BALL_LUKE, TRAINER_CUE_BALL_LUKE}, { {TRAINER_CUE_BALL_LUKE, TRAINER_CUE_BALL_LUKE},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_CUE_BALL_CAMRON, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CUE_BALL_CAMRON_2}, { {TRAINER_CUE_BALL_CAMRON, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_CAMRON_2},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_YOUNG_COUPLE_LEA_JED, TRAINER_YOUNG_COUPLE_LEA_JED}, { {TRAINER_YOUNG_COUPLE_LEA_JED, TRAINER_YOUNG_COUPLE_LEA_JED},
MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16) }, MAP(ROUTE16) },
{ {TRAINER_BIKER_BILLY, TRAINER_BIKER_BILLY}, { {TRAINER_BIKER_BILLY, TRAINER_BIKER_BILLY},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_BIKER_NIKOLAS, TRAINER_BIKER_NIKOLAS}, { {TRAINER_BIKER_NIKOLAS, TRAINER_BIKER_NIKOLAS},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_BIKER_JAXON, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIKER_JAXON_2}, { {TRAINER_BIKER_JAXON, SKIP, SKIP, SKIP, TRAINER_BIKER_JAXON_2},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_BIKER_WILLIAM, TRAINER_BIKER_WILLIAM}, { {TRAINER_BIKER_WILLIAM, TRAINER_BIKER_WILLIAM},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_CUE_BALL_RAUL, TRAINER_CUE_BALL_RAUL}, { {TRAINER_CUE_BALL_RAUL, TRAINER_CUE_BALL_RAUL},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_CUE_BALL_ISAIAH, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CUE_BALL_ISAIAH_2}, { {TRAINER_CUE_BALL_ISAIAH, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_ISAIAH_2},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_CUE_BALL_ZEEK, TRAINER_CUE_BALL_ZEEK}, { {TRAINER_CUE_BALL_ZEEK, TRAINER_CUE_BALL_ZEEK},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_CUE_BALL_JAMAL, TRAINER_CUE_BALL_JAMAL}, { {TRAINER_CUE_BALL_JAMAL, TRAINER_CUE_BALL_JAMAL},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_CUE_BALL_COREY, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CUE_BALL_COREY_2}, { {TRAINER_CUE_BALL_COREY, SKIP, SKIP, SKIP, TRAINER_CUE_BALL_COREY_2},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_BIKER_VIRGIL, TRAINER_BIKER_VIRGIL}, { {TRAINER_BIKER_VIRGIL, TRAINER_BIKER_VIRGIL},
MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) }, MAP(ROUTE17) },
{ {TRAINER_BIRD_KEEPER_WILTON, TRAINER_BIRD_KEEPER_WILTON}, { {TRAINER_BIRD_KEEPER_WILTON, TRAINER_BIRD_KEEPER_WILTON},
MAP_GROUP(ROUTE18), MAP_NUM(ROUTE18) }, MAP(ROUTE18) },
{ {TRAINER_BIRD_KEEPER_RAMIRO, TRAINER_BIRD_KEEPER_RAMIRO}, { {TRAINER_BIRD_KEEPER_RAMIRO, TRAINER_BIRD_KEEPER_RAMIRO},
MAP_GROUP(ROUTE18), MAP_NUM(ROUTE18) }, MAP(ROUTE18) },
{ {TRAINER_BIRD_KEEPER_JACOB, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_JACOB_2, TRAINER_BIRD_KEEPER_JACOB_3}, { {TRAINER_BIRD_KEEPER_JACOB, SKIP, SKIP, TRAINER_BIRD_KEEPER_JACOB_2, TRAINER_BIRD_KEEPER_JACOB_3},
MAP_GROUP(ROUTE18), MAP_NUM(ROUTE18) }, MAP(ROUTE18) },
{ {TRAINER_SWIMMER_MALE_RICHARD, TRAINER_SWIMMER_MALE_RICHARD}, { {TRAINER_SWIMMER_MALE_RICHARD, TRAINER_SWIMMER_MALE_RICHARD},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_REECE, TRAINER_SWIMMER_MALE_REECE}, { {TRAINER_SWIMMER_MALE_REECE, TRAINER_SWIMMER_MALE_REECE},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_MATTHEW, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_MATTHEW_2}, { {TRAINER_SWIMMER_MALE_MATTHEW, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_MATTHEW_2},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_DOUGLAS, TRAINER_SWIMMER_MALE_DOUGLAS}, { {TRAINER_SWIMMER_MALE_DOUGLAS, TRAINER_SWIMMER_MALE_DOUGLAS},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_DAVID, TRAINER_SWIMMER_MALE_DAVID}, { {TRAINER_SWIMMER_MALE_DAVID, TRAINER_SWIMMER_MALE_DAVID},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_TONY, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_TONY_2}, { {TRAINER_SWIMMER_MALE_TONY, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_TONY_2},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_AXLE, TRAINER_SWIMMER_MALE_AXLE}, { {TRAINER_SWIMMER_MALE_AXLE, TRAINER_SWIMMER_MALE_AXLE},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_FEMALE_ANYA, TRAINER_SWIMMER_FEMALE_ANYA}, { {TRAINER_SWIMMER_FEMALE_ANYA, TRAINER_SWIMMER_FEMALE_ANYA},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_FEMALE_ALICE, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_FEMALE_ALICE_2}, { {TRAINER_SWIMMER_FEMALE_ALICE, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_ALICE_2},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_FEMALE_CONNIE, TRAINER_SWIMMER_FEMALE_CONNIE}, { {TRAINER_SWIMMER_FEMALE_CONNIE, TRAINER_SWIMMER_FEMALE_CONNIE},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SIS_AND_BRO_LIA_LUC, TRAINER_SIS_AND_BRO_LIA_LUC}, { {TRAINER_SIS_AND_BRO_LIA_LUC, TRAINER_SIS_AND_BRO_LIA_LUC},
MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19) }, MAP(ROUTE19) },
{ {TRAINER_SWIMMER_MALE_BARRY, TRAINER_SWIMMER_MALE_BARRY}, { {TRAINER_SWIMMER_MALE_BARRY, TRAINER_SWIMMER_MALE_BARRY},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_MALE_DEAN, TRAINER_SWIMMER_MALE_DEAN}, { {TRAINER_SWIMMER_MALE_DEAN, TRAINER_SWIMMER_MALE_DEAN},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_MALE_DARRIN, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_DARRIN_2}, { {TRAINER_SWIMMER_MALE_DARRIN, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_DARRIN_2},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_FEMALE_TIFFANY, TRAINER_SWIMMER_FEMALE_TIFFANY}, { {TRAINER_SWIMMER_FEMALE_TIFFANY, TRAINER_SWIMMER_FEMALE_TIFFANY},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_FEMALE_NORA, TRAINER_SWIMMER_FEMALE_NORA}, { {TRAINER_SWIMMER_FEMALE_NORA, TRAINER_SWIMMER_FEMALE_NORA},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_FEMALE_MELISSA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_FEMALE_MELISSA_2}, { {TRAINER_SWIMMER_FEMALE_MELISSA, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_MELISSA_2},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_SWIMMER_FEMALE_SHIRLEY, TRAINER_SWIMMER_FEMALE_SHIRLEY}, { {TRAINER_SWIMMER_FEMALE_SHIRLEY, TRAINER_SWIMMER_FEMALE_SHIRLEY},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_BIRD_KEEPER_ROGER, TRAINER_BIRD_KEEPER_ROGER}, { {TRAINER_BIRD_KEEPER_ROGER, TRAINER_BIRD_KEEPER_ROGER},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_PICNICKER_MISSY, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PICNICKER_MISSY_2, TRAINER_PICNICKER_MISSY_3}, { {TRAINER_PICNICKER_MISSY, SKIP, SKIP, SKIP, TRAINER_PICNICKER_MISSY_2, TRAINER_PICNICKER_MISSY_3},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_PICNICKER_IRENE, TRAINER_PICNICKER_IRENE}, { {TRAINER_PICNICKER_IRENE, TRAINER_PICNICKER_IRENE},
MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20) }, MAP(ROUTE20) },
{ {TRAINER_FISHERMAN_RONALD, TRAINER_FISHERMAN_RONALD}, { {TRAINER_FISHERMAN_RONALD, TRAINER_FISHERMAN_RONALD},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_FISHERMAN_CLAUDE, TRAINER_FISHERMAN_CLAUDE}, { {TRAINER_FISHERMAN_CLAUDE, TRAINER_FISHERMAN_CLAUDE},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_FISHERMAN_WADE, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_FISHERMAN_WADE_2}, { {TRAINER_FISHERMAN_WADE, SKIP, SKIP, SKIP, TRAINER_FISHERMAN_WADE_2},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_FISHERMAN_NOLAN, TRAINER_FISHERMAN_NOLAN}, { {TRAINER_FISHERMAN_NOLAN, TRAINER_FISHERMAN_NOLAN},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SWIMMER_MALE_SPENCER, TRAINER_SWIMMER_MALE_SPENCER}, { {TRAINER_SWIMMER_MALE_SPENCER, TRAINER_SWIMMER_MALE_SPENCER},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SWIMMER_MALE_JACK, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_JACK_2}, { {TRAINER_SWIMMER_MALE_JACK, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_JACK_2},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SWIMMER_MALE_JEROME, TRAINER_SWIMMER_MALE_JEROME}, { {TRAINER_SWIMMER_MALE_JEROME, TRAINER_SWIMMER_MALE_JEROME},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SWIMMER_MALE_ROLAND, TRAINER_SWIMMER_MALE_ROLAND}, { {TRAINER_SWIMMER_MALE_ROLAND, TRAINER_SWIMMER_MALE_ROLAND},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SIS_AND_BRO_LIL_IAN, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SIS_AND_BRO_LIL_IAN_2, TRAINER_SIS_AND_BRO_LIL_IAN_3}, { {TRAINER_SIS_AND_BRO_LIL_IAN, SKIP, SKIP, SKIP, TRAINER_SIS_AND_BRO_LIL_IAN_2, TRAINER_SIS_AND_BRO_LIL_IAN_3},
MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) }, MAP(ROUTE21_NORTH) },
{ {TRAINER_SWIMMER_FEMALE_MARIA, TRAINER_SWIMMER_FEMALE_MARIA}, { {TRAINER_SWIMMER_FEMALE_MARIA, TRAINER_SWIMMER_FEMALE_MARIA},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_SWIMMER_FEMALE_ABIGAIL, TRAINER_SWIMMER_FEMALE_ABIGAIL}, { {TRAINER_SWIMMER_FEMALE_ABIGAIL, TRAINER_SWIMMER_FEMALE_ABIGAIL},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_SWIMMER_MALE_FINN, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_FINN_2}, { {TRAINER_SWIMMER_MALE_FINN, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_FINN_2},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_SWIMMER_MALE_GARRETT, TRAINER_SWIMMER_MALE_GARRETT}, { {TRAINER_SWIMMER_MALE_GARRETT, TRAINER_SWIMMER_MALE_GARRETT},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_FISHERMAN_TOMMY, TRAINER_FISHERMAN_TOMMY}, { {TRAINER_FISHERMAN_TOMMY, TRAINER_FISHERMAN_TOMMY},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_CRUSH_GIRL_SHARON, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CRUSH_GIRL_SHARON_2, TRAINER_CRUSH_GIRL_SHARON_3}, { {TRAINER_CRUSH_GIRL_SHARON, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_SHARON_2, TRAINER_CRUSH_GIRL_SHARON_3},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_CRUSH_GIRL_TANYA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CRUSH_GIRL_TANYA_2, TRAINER_CRUSH_GIRL_TANYA_3}, { {TRAINER_CRUSH_GIRL_TANYA, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_TANYA_2, TRAINER_CRUSH_GIRL_TANYA_3},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_BLACK_BELT_SHEA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BLACK_BELT_SHEA_2, TRAINER_BLACK_BELT_SHEA_3}, { {TRAINER_BLACK_BELT_SHEA, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_SHEA_2, TRAINER_BLACK_BELT_SHEA_3},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_BLACK_BELT_HUGH, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BLACK_BELT_HUGH_2, TRAINER_BLACK_BELT_HUGH_3}, { {TRAINER_BLACK_BELT_HUGH, SKIP, SKIP, SKIP, TRAINER_BLACK_BELT_HUGH_2, TRAINER_BLACK_BELT_HUGH_3},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_CAMPER_BRYCE, TRAINER_CAMPER_BRYCE}, { {TRAINER_CAMPER_BRYCE, TRAINER_CAMPER_BRYCE},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_PICNICKER_CLAIRE, TRAINER_PICNICKER_CLAIRE}, { {TRAINER_PICNICKER_CLAIRE, TRAINER_PICNICKER_CLAIRE},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_CRUSH_KIN_MIK_KIA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CRUSH_KIN_MIK_KIA_2, TRAINER_CRUSH_KIN_MIK_KIA_3}, { {TRAINER_CRUSH_KIN_MIK_KIA, SKIP, SKIP, SKIP, TRAINER_CRUSH_KIN_MIK_KIA_2, TRAINER_CRUSH_KIN_MIK_KIA_3},
MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD) }, MAP(ONE_ISLAND_KINDLE_ROAD) },
{ {TRAINER_SWIMMER_FEMALE_AMARA, TRAINER_SWIMMER_FEMALE_AMARA}, { {TRAINER_SWIMMER_FEMALE_AMARA, TRAINER_SWIMMER_FEMALE_AMARA},
MAP_GROUP(ONE_ISLAND_TREASURE_BEACH), MAP_NUM(ONE_ISLAND_TREASURE_BEACH) }, MAP(ONE_ISLAND_TREASURE_BEACH) },
{ {TRAINER_AROMA_LADY_NIKKI, TRAINER_AROMA_LADY_NIKKI}, { {TRAINER_AROMA_LADY_NIKKI, TRAINER_AROMA_LADY_NIKKI},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_AROMA_LADY_VIOLET, TRAINER_AROMA_LADY_VIOLET}, { {TRAINER_AROMA_LADY_VIOLET, TRAINER_AROMA_LADY_VIOLET},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_TUBER_AMIRA, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_TUBER_AMIRA_2}, { {TRAINER_TUBER_AMIRA, SKIP, SKIP, SKIP, TRAINER_TUBER_AMIRA_2},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_TUBER_ALEXIS, TRAINER_TUBER_ALEXIS}, { {TRAINER_TUBER_ALEXIS, TRAINER_TUBER_ALEXIS},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_SWIMMER_FEMALE_TISHA, TRAINER_SWIMMER_FEMALE_TISHA}, { {TRAINER_SWIMMER_FEMALE_TISHA, TRAINER_SWIMMER_FEMALE_TISHA},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_TWINS_JOY_MEG, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_TWINS_JOY_MEG_2}, { {TRAINER_TWINS_JOY_MEG, SKIP, SKIP, SKIP, TRAINER_TWINS_JOY_MEG_2},
MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE) }, MAP(THREE_ISLAND_BOND_BRIDGE) },
{ {TRAINER_PAINTER_DAISY, TRAINER_PAINTER_DAISY}, { {TRAINER_PAINTER_DAISY, TRAINER_PAINTER_DAISY},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_PAINTER_CELINA, TRAINER_PAINTER_CELINA}, { {TRAINER_PAINTER_CELINA, TRAINER_PAINTER_CELINA},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_PAINTER_RAYNA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PAINTER_RAYNA_2}, { {TRAINER_PAINTER_RAYNA, SKIP, SKIP, SKIP, SKIP, TRAINER_PAINTER_RAYNA_2},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_LADY_JACKI, TRAINER_LADY_JACKI}, { {TRAINER_LADY_JACKI, TRAINER_LADY_JACKI},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_LADY_GILLIAN, TRAINER_LADY_GILLIAN}, { {TRAINER_LADY_GILLIAN, TRAINER_LADY_GILLIAN},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_YOUNGSTER_DESTIN, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_YOUNGSTER_DESTIN_2}, { {TRAINER_YOUNGSTER_DESTIN, SKIP, SKIP, SKIP, SKIP, TRAINER_YOUNGSTER_DESTIN_2},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_SWIMMER_MALE_TOBY, TRAINER_SWIMMER_MALE_TOBY}, { {TRAINER_SWIMMER_MALE_TOBY, TRAINER_SWIMMER_MALE_TOBY},
MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS) }, MAP(FIVE_ISLAND_RESORT_GORGEOUS) },
{ {TRAINER_PKMN_BREEDER_ALIZE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PKMN_BREEDER_ALIZE_2}, { {TRAINER_PKMN_BREEDER_ALIZE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_BREEDER_ALIZE_2},
MAP_GROUP(FIVE_ISLAND_WATER_LABYRINTH), MAP_NUM(FIVE_ISLAND_WATER_LABYRINTH) }, MAP(FIVE_ISLAND_WATER_LABYRINTH) },
{ {TRAINER_BIRD_KEEPER_MILO, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_MILO_2}, { {TRAINER_BIRD_KEEPER_MILO, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_MILO_2},
MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR) }, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },
{ {TRAINER_BIRD_KEEPER_CHAZ, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_CHAZ_2}, { {TRAINER_BIRD_KEEPER_CHAZ, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_CHAZ_2},
MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR) }, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },
{ {TRAINER_BIRD_KEEPER_HAROLD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_BIRD_KEEPER_HAROLD_2}, { {TRAINER_BIRD_KEEPER_HAROLD, SKIP, SKIP, SKIP, SKIP, TRAINER_BIRD_KEEPER_HAROLD_2},
MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR) }, MAP(FIVE_ISLAND_MEMORIAL_PILLAR) },
{ {TRAINER_FISHERMAN_TYLOR, TRAINER_FISHERMAN_TYLOR}, { {TRAINER_FISHERMAN_TYLOR, TRAINER_FISHERMAN_TYLOR},
MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND) }, MAP(SIX_ISLAND_OUTCAST_ISLAND) },
{ {TRAINER_SWIMMER_MALE_MYMO, TRAINER_SWIMMER_MALE_MYMO}, { {TRAINER_SWIMMER_MALE_MYMO, TRAINER_SWIMMER_MALE_MYMO},
MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND) }, MAP(SIX_ISLAND_OUTCAST_ISLAND) },
{ {TRAINER_SWIMMER_FEMALE_NICOLE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_FEMALE_NICOLE_2}, { {TRAINER_SWIMMER_FEMALE_NICOLE, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_FEMALE_NICOLE_2},
MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND) }, MAP(SIX_ISLAND_OUTCAST_ISLAND) },
{ {TRAINER_SIS_AND_BRO_AVA_GEB, TRAINER_SIS_AND_BRO_AVA_GEB}, { {TRAINER_SIS_AND_BRO_AVA_GEB, TRAINER_SIS_AND_BRO_AVA_GEB},
MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND) }, MAP(SIX_ISLAND_OUTCAST_ISLAND) },
{ {TRAINER_PSYCHIC_JACLYN, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PSYCHIC_JACLYN_2}, { {TRAINER_PSYCHIC_JACLYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_JACLYN_2},
MAP_GROUP(SIX_ISLAND_GREEN_PATH), MAP_NUM(SIX_ISLAND_GREEN_PATH) }, MAP(SIX_ISLAND_GREEN_PATH) },
{ {TRAINER_AROMA_LADY_ROSE, TRAINER_AROMA_LADY_ROSE}, { {TRAINER_AROMA_LADY_ROSE, TRAINER_AROMA_LADY_ROSE},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_JUGGLER_EDWARD, TRAINER_JUGGLER_EDWARD}, { {TRAINER_JUGGLER_EDWARD, TRAINER_JUGGLER_EDWARD},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_SWIMMER_MALE_SAMIR, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_SWIMMER_MALE_SAMIR_2}, { {TRAINER_SWIMMER_MALE_SAMIR, SKIP, SKIP, SKIP, SKIP, TRAINER_SWIMMER_MALE_SAMIR_2},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_SWIMMER_FEMALE_DENISE, TRAINER_SWIMMER_FEMALE_DENISE}, { {TRAINER_SWIMMER_FEMALE_DENISE, TRAINER_SWIMMER_FEMALE_DENISE},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_TWINS_MIU_MIA, TRAINER_TWINS_MIU_MIA}, { {TRAINER_TWINS_MIU_MIA, TRAINER_TWINS_MIU_MIA},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_HIKER_EARL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_HIKER_EARL_2}, { {TRAINER_HIKER_EARL, SKIP, SKIP, SKIP, SKIP, TRAINER_HIKER_EARL_2},
MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH) }, MAP(SIX_ISLAND_WATER_PATH) },
{ {TRAINER_RUIN_MANIAC_STANLY, TRAINER_RUIN_MANIAC_STANLY}, { {TRAINER_RUIN_MANIAC_STANLY, TRAINER_RUIN_MANIAC_STANLY},
MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY) }, MAP(SIX_ISLAND_RUIN_VALLEY) },
{ {TRAINER_RUIN_MANIAC_FOSTER, TRAINER_RUIN_MANIAC_FOSTER}, { {TRAINER_RUIN_MANIAC_FOSTER, TRAINER_RUIN_MANIAC_FOSTER},
MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY) }, MAP(SIX_ISLAND_RUIN_VALLEY) },
{ {TRAINER_RUIN_MANIAC_LARRY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_RUIN_MANIAC_LARRY_2}, { {TRAINER_RUIN_MANIAC_LARRY, SKIP, SKIP, SKIP, SKIP, TRAINER_RUIN_MANIAC_LARRY_2},
MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY) }, MAP(SIX_ISLAND_RUIN_VALLEY) },
{ {TRAINER_HIKER_DARYL, TRAINER_HIKER_DARYL}, { {TRAINER_HIKER_DARYL, TRAINER_HIKER_DARYL},
MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY) }, MAP(SIX_ISLAND_RUIN_VALLEY) },
{ {TRAINER_POKEMANIAC_HECTOR, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_POKEMANIAC_HECTOR_2}, { {TRAINER_POKEMANIAC_HECTOR, SKIP, SKIP, SKIP, SKIP, TRAINER_POKEMANIAC_HECTOR_2},
MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY) }, MAP(SIX_ISLAND_RUIN_VALLEY) },
{ {TRAINER_PSYCHIC_DARIO, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PSYCHIC_DARIO_2}, { {TRAINER_PSYCHIC_DARIO, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_DARIO_2},
MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER), MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER) }, MAP(SEVEN_ISLAND_TRAINER_TOWER) },
{ {TRAINER_PSYCHIC_RODETTE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PSYCHIC_RODETTE_2}, { {TRAINER_PSYCHIC_RODETTE, SKIP, SKIP, SKIP, SKIP, TRAINER_PSYCHIC_RODETTE_2},
MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER), MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER) }, MAP(SEVEN_ISLAND_TRAINER_TOWER) },
{ {TRAINER_AROMA_LADY_MIAH, TRAINER_AROMA_LADY_MIAH}, { {TRAINER_AROMA_LADY_MIAH, TRAINER_AROMA_LADY_MIAH},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },
{ {TRAINER_YOUNG_COUPLE_EVE_JON, TRAINER_YOUNG_COUPLE_EVE_JON}, { {TRAINER_YOUNG_COUPLE_EVE_JON, TRAINER_YOUNG_COUPLE_EVE_JON},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },
{ {TRAINER_JUGGLER_MASON, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_JUGGLER_MASON_2}, { {TRAINER_JUGGLER_MASON, SKIP, SKIP, SKIP, SKIP, TRAINER_JUGGLER_MASON_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },
{ {TRAINER_PKMN_RANGER_NICOLAS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PKMN_RANGER_NICOLAS_2}, { {TRAINER_PKMN_RANGER_NICOLAS, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_NICOLAS_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },
{ {TRAINER_PKMN_RANGER_MADELINE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PKMN_RANGER_MADELINE_2}, { {TRAINER_PKMN_RANGER_MADELINE, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_MADELINE_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE) },
{ {TRAINER_CRUSH_GIRL_CYNDY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_CRUSH_GIRL_CYNDY_2}, { {TRAINER_CRUSH_GIRL_CYNDY, SKIP, SKIP, SKIP, SKIP, TRAINER_CRUSH_GIRL_CYNDY_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_TAMER_EVAN, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_TAMER_EVAN_2}, { {TRAINER_TAMER_EVAN, SKIP, SKIP, SKIP, SKIP, TRAINER_TAMER_EVAN_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_PKMN_RANGER_JACKSON, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PKMN_RANGER_JACKSON_2}, { {TRAINER_PKMN_RANGER_JACKSON, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_JACKSON_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_PKMN_RANGER_KATELYN, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_PKMN_RANGER_KATELYN_2}, { {TRAINER_PKMN_RANGER_KATELYN, SKIP, SKIP, SKIP, SKIP, TRAINER_PKMN_RANGER_KATELYN_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_COOLTRAINER_LEROY, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_COOLTRAINER_LEROY_2}, { {TRAINER_COOLTRAINER_LEROY, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_LEROY_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_COOLTRAINER_MICHELLE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_COOLTRAINER_MICHELLE_2}, { {TRAINER_COOLTRAINER_MICHELLE, SKIP, SKIP, SKIP, SKIP, TRAINER_COOLTRAINER_MICHELLE_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_COOL_COUPLE_LEX_NYA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, TRAINER_COOL_COUPLE_LEX_NYA_2}, { {TRAINER_COOL_COUPLE_LEX_NYA, SKIP, SKIP, SKIP, SKIP, TRAINER_COOL_COUPLE_LEX_NYA_2},
MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON) }, MAP(SEVEN_ISLAND_SEVAULT_CANYON) },
{ {TRAINER_RUIN_MANIAC_BRANDON, TRAINER_RUIN_MANIAC_BRANDON}, { {TRAINER_RUIN_MANIAC_BRANDON, TRAINER_RUIN_MANIAC_BRANDON},
MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS) }, MAP(SEVEN_ISLAND_TANOBY_RUINS) },
{ {TRAINER_RUIN_MANIAC_BENJAMIN, TRAINER_RUIN_MANIAC_BENJAMIN}, { {TRAINER_RUIN_MANIAC_BENJAMIN, TRAINER_RUIN_MANIAC_BENJAMIN},
MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS) }, MAP(SEVEN_ISLAND_TANOBY_RUINS) },
{ {TRAINER_PAINTER_EDNA, TRAINER_PAINTER_EDNA}, { {TRAINER_PAINTER_EDNA, TRAINER_PAINTER_EDNA},
MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS) }, MAP(SEVEN_ISLAND_TANOBY_RUINS) },
{ {TRAINER_GENTLEMAN_CLIFFORD, TRAINER_GENTLEMAN_CLIFFORD}, { {TRAINER_GENTLEMAN_CLIFFORD, TRAINER_GENTLEMAN_CLIFFORD},
MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS) }, MAP(SEVEN_ISLAND_TANOBY_RUINS) },
}; };
static const u8 sMovementScript_Wait48[] = { static const u8 sMovementScript_Wait48[] = {
@@ -760,7 +763,7 @@ void Task_VsSeeker_0(u8 taskId)
} }
else if (respval == VSSEEKER_CAN_USE) else if (respval == VSSEEKER_CAN_USE)
{ {
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xffff); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF);
FieldEffectStart(FLDEFF_USE_VS_SEEKER); FieldEffectStart(FLDEFF_USE_VS_SEEKER);
gTasks[taskId].func = Task_VsSeeker_1; gTasks[taskId].func = Task_VsSeeker_1;
gTasks[taskId].data[0] = 15; gTasks[taskId].data[0] = 15;
@@ -792,7 +795,7 @@ static void Task_VsSeeker_2(u8 taskId)
data[1] = 0; data[1] = 0;
data[2] = 0; data[2] = 0;
VsSeekerResetInBagStepCounter(); VsSeekerResetInBagStepCounter();
sVsSeeker->responseCode = GetVsSeekerResponseInArea(sVsSeekerData); sVsSeeker->responseCode = GetVsSeekerResponseInArea(sRematches);
ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, sMovementScript_Wait48); ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, sMovementScript_Wait48);
gTasks[taskId].func = Task_VsSeeker_3; gTasks[taskId].func = Task_VsSeeker_3;
} }
@@ -861,7 +864,7 @@ static u8 CanUseVsSeeker(void)
} }
} }
static u8 GetVsSeekerResponseInArea(const VsSeekerData * vsSeekerData) static u8 GetVsSeekerResponseInArea(const struct RematchData * vsSeekerData)
{ {
u16 trainerIdx = 0; u16 trainerIdx = 0;
u16 rval = 0; u16 rval = 0;
@@ -933,7 +936,7 @@ void ClearRematchStateByTrainerId(void)
{ {
u8 objEventId = 0; u8 objEventId = 0;
struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates; struct ObjectEventTemplate *objectEventTemplates = gSaveBlock1Ptr->objectEventTemplates;
int vsSeekerDataIdx = LookupVsSeekerOpponentInArray(sVsSeekerData, gTrainerBattleOpponent_A); int vsSeekerDataIdx = LookupVsSeekerOpponentInArray(sRematches, gTrainerBattleOpponent_A);
if (vsSeekerDataIdx != -1) if (vsSeekerDataIdx != -1)
{ {
@@ -943,7 +946,7 @@ void ClearRematchStateByTrainerId(void)
{ {
if ((objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL if ((objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL
|| objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) || objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED)
&& vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sVsSeekerData, GetTrainerFlagFromScript(objectEventTemplates[i].script))) && vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sRematches, GetTrainerFlagFromScript(objectEventTemplates[i].script)))
{ {
struct ObjectEvent *objectEvent; struct ObjectEvent *objectEvent;
@@ -995,7 +998,7 @@ static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchId
while (--rematchIdx != 0) while (--rematchIdx != 0)
{ {
const u16 *rematch_p = trainerIdxs + rematchIdx; const u16 *rematch_p = trainerIdxs + rematchIdx;
if (*rematch_p != 0xFFFF) if (*rematch_p != SKIP)
return rematchIdx; return rematchIdx;
} }
return 0; return 0;
@@ -1003,20 +1006,20 @@ static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchId
bool8 ShouldTryRematchBattle(void) bool8 ShouldTryRematchBattle(void)
{ {
if (ShouldTryRematchBattleInternal(sVsSeekerData, gTrainerBattleOpponent_A)) if (ShouldTryRematchBattleInternal(sRematches, gTrainerBattleOpponent_A))
{ {
return TRUE; return TRUE;
} }
return HasRematchTrainerAlreadyBeenFought(sVsSeekerData, gTrainerBattleOpponent_A); return HasRematchTrainerAlreadyBeenFought(sRematches, gTrainerBattleOpponent_A);
} }
static bool8 ShouldTryRematchBattleInternal(const VsSeekerData *vsSeekerData, u16 trainerBattleOpponent) static bool8 ShouldTryRematchBattleInternal(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)
{ {
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);
if (rematchIdx == -1) if (rematchIdx == -1)
return FALSE; return FALSE;
if (rematchIdx >= 0 && rematchIdx < NELEMS(sVsSeekerData)) if (rematchIdx >= 0 && rematchIdx < NELEMS(sRematches))
{ {
if (IsThisTrainerRematchable(gSpecialVar_LastTalked)) if (IsThisTrainerRematchable(gSpecialVar_LastTalked))
return TRUE; return TRUE;
@@ -1024,7 +1027,7 @@ static bool8 ShouldTryRematchBattleInternal(const VsSeekerData *vsSeekerData, u1
return FALSE; return FALSE;
} }
static bool8 HasRematchTrainerAlreadyBeenFought(const VsSeekerData *vsSeekerData, u16 trainerBattleOpponent) static bool8 HasRematchTrainerAlreadyBeenFought(const struct RematchData *vsSeekerData, u16 trainerBattleOpponent)
{ {
s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent); s32 rematchIdx = GetRematchIdx(vsSeekerData, trainerBattleOpponent);
@@ -1041,19 +1044,19 @@ void ClearRematchStateOfLastTalked(void)
SetBattledTrainerFlag(); SetBattledTrainerFlag();
} }
static int LookupVsSeekerOpponentInArray(const VsSeekerData * array, u16 trainerId) static int LookupVsSeekerOpponentInArray(const struct RematchData * array, u16 trainerId)
{ {
int i, j; int i, j;
for (i = 0; i < NELEMS(sVsSeekerData); i++) for (i = 0; i < NELEMS(sRematches); i++)
{ {
for (j = 0; j < 6; j++) for (j = 0; j < MAX_REMATCH_PARTIES; j++)
{ {
u16 testTrainerId; u16 testTrainerId;
if (array[i].trainerIdxs[j] == 0) if (array[i].trainerIdxs[j] == 0)
break; break;
testTrainerId = array[i].trainerIdxs[j]; testTrainerId = array[i].trainerIdxs[j];
if (testTrainerId == 0xFFFF) if (testTrainerId == SKIP)
continue; continue;
if (testTrainerId == trainerId) if (testTrainerId == trainerId)
return i; return i;
@@ -1067,25 +1070,25 @@ int GetRematchTrainerId(u16 trainerId)
{ {
u8 i; u8 i;
u8 j; u8 j;
j = GetNextAvailableRematchTrainer(sVsSeekerData, trainerId, &i); j = GetNextAvailableRematchTrainer(sRematches, trainerId, &i);
if (!j) if (!j)
return 0; return 0;
TryGetRematchTrainerIdGivenGameState(sVsSeekerData[i].trainerIdxs, &j); TryGetRematchTrainerIdGivenGameState(sRematches[i].trainerIdxs, &j);
return sVsSeekerData[i].trainerIdxs[j]; return sRematches[i].trainerIdxs[j];
} }
u8 IsTrainerReadyForRematch(void) u8 IsTrainerReadyForRematch(void)
{ {
return IsTrainerReadyForRematchInternal(sVsSeekerData, gTrainerBattleOpponent_A); return IsTrainerReadyForRematchInternal(sRematches, gTrainerBattleOpponent_A);
} }
static bool8 IsTrainerReadyForRematchInternal(const VsSeekerData * array, u16 trainerId) static bool8 IsTrainerReadyForRematchInternal(const struct RematchData * array, u16 trainerId)
{ {
int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId); int rematchTrainerIdx = LookupVsSeekerOpponentInArray(array, trainerId);
if (rematchTrainerIdx == -1) if (rematchTrainerIdx == -1)
return FALSE; return FALSE;
if (rematchTrainerIdx >= NELEMS(sVsSeekerData)) if (rematchTrainerIdx >= NELEMS(sRematches))
return FALSE; return FALSE;
if (!IsThisTrainerRematchable(gSpecialVar_LastTalked)) if (!IsThisTrainerRematchable(gSpecialVar_LastTalked))
return FALSE; return FALSE;
@@ -1177,11 +1180,11 @@ static u16 GetTrainerFlagFromScript(const u8 *script)
return trainerFlag; return trainerFlag;
} }
static int GetRematchIdx(const VsSeekerData * vsSeekerData, u16 trainerFlagIdx) static int GetRematchIdx(const struct RematchData * vsSeekerData, u16 trainerFlagIdx)
{ {
int i; int i;
for (i = 0; i < NELEMS(sVsSeekerData); i++) for (i = 0; i < NELEMS(sRematches); i++)
{ {
if (vsSeekerData[i].trainerIdxs[0] == trainerFlagIdx) if (vsSeekerData[i].trainerIdxs[0] == trainerFlagIdx)
return i; return i;
@@ -1223,20 +1226,20 @@ static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo)
return FALSE; return FALSE;
} }
static u8 GetNextAvailableRematchTrainer(const VsSeekerData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr) static u8 GetNextAvailableRematchTrainer(const struct RematchData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr)
{ {
int i, j; int i, j;
for (i = 0; i < NELEMS(sVsSeekerData); i++) for (i = 0; i < NELEMS(sRematches); i++)
{ {
if (vsSeekerData[i].trainerIdxs[0] == trainerFlagNo) if (vsSeekerData[i].trainerIdxs[0] == trainerFlagNo)
{ {
*idxPtr = i; *idxPtr = i;
for (j = 1; j < 6; j++) for (j = 1; j < MAX_REMATCH_PARTIES; j++)
{ {
if (vsSeekerData[i].trainerIdxs[j] == 0) if (vsSeekerData[i].trainerIdxs[j] == TRAINER_NONE)
return j - 1; return j - 1;
if (vsSeekerData[i].trainerIdxs[j] == 0xffff) if (vsSeekerData[i].trainerIdxs[j] == SKIP)
continue; continue;
if (HasTrainerBeenFought(vsSeekerData[i].trainerIdxs[j])) if (HasTrainerBeenFought(vsSeekerData[i].trainerIdxs[j]))
continue; continue;
@@ -1259,7 +1262,7 @@ static u8 GetRematchableTrainerLocalId(void)
{ {
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1) if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1)
{ {
if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sVsSeekerData, sVsSeeker->trainerInfo[i].trainerIdx, &idx)) if (HasTrainerBeenFought(sVsSeeker->trainerInfo[i].trainerIdx) != 1 || GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[i].trainerIdx, &idx))
return sVsSeeker->trainerInfo[i].localId; return sVsSeeker->trainerInfo[i].localId;
} }
} }
@@ -1310,7 +1313,7 @@ static void StartAllRespondantIdleMovements(void)
if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1) if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1)
SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]); OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sVsSeekerData, sVsSeeker->trainerInfo[j].trainerIdx, &dummy); gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sRematches, sVsSeeker->trainerInfo[j].trainerIdx, &dummy);
} }
} }
} }