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;
+29 -28
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)
@@ -128,28 +134,23 @@
#define QL_DEPARTED_MISC_BUILDING_1 8 #define QL_DEPARTED_MISC_BUILDING_1 8
#define QL_DEPARTED_MISC_BUILDING_2 9 #define QL_DEPARTED_MISC_BUILDING_2 9
#define QL_INPUT_OFF 0 #define QL_INPUT_OFF 0
#define QL_INPUT_UP 1 #define QL_INPUT_UP 1
#define QL_INPUT_DOWN 2 #define QL_INPUT_DOWN 2
#define QL_INPUT_LEFT 3 #define QL_INPUT_LEFT 3
#define QL_INPUT_RIGHT 4 #define QL_INPUT_RIGHT 4
#define QL_INPUT_L 5 #define QL_INPUT_L 5
#define QL_INPUT_R 6 #define QL_INPUT_R 6
#define QL_INPUT_START 7 #define QL_INPUT_START 7
#define QL_INPUT_SELECT 8 #define QL_INPUT_SELECT 8
#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();
+9 -9
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);
sBerryPowderVendorWindowId = AddWindow(&template); template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);
FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0); sBerryPowderVendorWindowId = AddWindow(&template);
PutWindowTilemap(sBerryPowderVendorWindowId); FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0);
LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13)); PutWindowTilemap(sBerryPowderVendorWindowId);
DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder()); LoadStdWindowGfx(sBerryPowderVendorWindowId, 0x21D, BG_PLTT_ID(13));
} 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;
} }
+5 -5
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);
CreateStopSurfingTask(DIR_NORTH); QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16);
} CreateStopSurfingTask(DIR_NORTH);
} }
static void Task_StopSurfingInit(u8 taskId) static void Task_StopSurfingInit(u8 taskId)
+129 -127
View File
@@ -1095,18 +1095,19 @@ 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)
sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate); return;
LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13));
DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13); sElevatorCurrentFloorWindowId = AddWindow(&sElevatorCurrentFloorWindowTemplate);
AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, gText_NowOn, 0, 2, 0xFF, NULL); LoadStdWindowGfx(sElevatorCurrentFloorWindowId, 0x21D, BG_PLTT_ID(13));
floorname = sFloorNamePointers[gSpecialVar_0x8005]; DrawStdFrameWithCustomTileAndPalette(sElevatorCurrentFloorWindowId, FALSE, 0x21D, 13);
strwidth = GetStringWidth(FONT_NORMAL, floorname, 0); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, gText_NowOn, 0, 2, 0xFF, NULL);
AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL); floorname = sFloorNamePointers[gSpecialVar_0x8005];
PutWindowTilemap(sElevatorCurrentFloorWindowId); strwidth = GetStringWidth(FONT_NORMAL, floorname, 0);
CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL); AddTextPrinterParameterized(sElevatorCurrentFloorWindowId, FONT_NORMAL, floorname, 56 - strwidth, 16, 0xFF, NULL);
} PutWindowTilemap(sElevatorCurrentFloorWindowId);
CopyWindowToVram(sElevatorCurrentFloorWindowId, COPYWIN_FULL);
} }
void CloseElevatorCurrentFloorWindow(void) void CloseElevatorCurrentFloorWindow(void)
@@ -1164,91 +1165,92 @@ 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);
task = &gTasks[taskId];
switch (gSpecialVar_0x8004)
{ {
taskId = CreateTask(Task_CreateScriptListMenu, 8); case LISTMENU_BADGES:
task = &gTasks[taskId]; task->data[0] = 4;
switch (gSpecialVar_0x8004) task->data[1] = 9;
{ task->data[2] = 1;
case LISTMENU_BADGES: task->data[3] = 1;
task->data[0] = 4; task->data[4] = 12;
task->data[1] = 9; task->data[5] = 7;
task->data[2] = 1; task->data[6] = 1;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 12; break;
task->data[5] = 7; case LISTMENU_SILPHCO_FLOORS:
task->data[6] = 1; task->data[0] = 7;
task->data[15] = taskId; task->data[1] = 12;
break; task->data[2] = 1;
case LISTMENU_SILPHCO_FLOORS: task->data[3] = 1;
task->data[0] = 7; task->data[4] = 8;
task->data[1] = 12; task->data[5] = 12;
task->data[2] = 1; task->data[6] = 0;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 8; task->data[7] = sElevatorScroll;
task->data[5] = 12; task->data[8] = sElevatorCursorPos;
task->data[6] = 0; break;
task->data[15] = taskId; case LISTMENU_ROCKET_HIDEOUT_FLOORS: // Multichoice used instead
task->data[7] = sElevatorScroll; task->data[0] = 4;
task->data[8] = sElevatorCursorPos; task->data[1] = 4;
break; task->data[2] = 1;
case LISTMENU_ROCKET_HIDEOUT_FLOORS: // Multichoice used instead task->data[3] = 1;
task->data[0] = 4; task->data[4] = 8;
task->data[1] = 4; task->data[5] = 8;
task->data[2] = 1; task->data[6] = 0;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 8; break;
task->data[5] = 8; case LISTMENU_DEPT_STORE_FLOORS: // Multichoice used instead
task->data[6] = 0; task->data[0] = 4;
task->data[15] = taskId; task->data[1] = 6;
break; task->data[2] = 1;
case LISTMENU_DEPT_STORE_FLOORS: // Multichoice used instead task->data[3] = 1;
task->data[0] = 4; task->data[4] = 8;
task->data[1] = 6; task->data[5] = 8;
task->data[2] = 1; task->data[6] = 0;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 8; break;
task->data[5] = 8; case LISTMENU_WIRELESS_LECTURE_HEADERS: // Multichoice used instead
task->data[6] = 0; task->data[0] = 4;
task->data[15] = taskId; task->data[1] = 4;
break; task->data[2] = 1;
case LISTMENU_WIRELESS_LECTURE_HEADERS: // Multichoice used instead task->data[3] = 1;
task->data[0] = 4; task->data[4] = 17;
task->data[1] = 4; task->data[5] = 8;
task->data[2] = 1; task->data[6] = 1;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 17; break;
task->data[5] = 8; case LISTMENU_BERRY_POWDER:
task->data[6] = 1; task->data[0] = 7;
task->data[15] = taskId; task->data[1] = 12;
break; task->data[2] = 16;
case LISTMENU_BERRY_POWDER: task->data[3] = 1;
task->data[0] = 7; task->data[4] = 17;
task->data[1] = 12; task->data[5] = 12;
task->data[2] = 16; task->data[6] = 0;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 17; break;
task->data[5] = 12; case LISTMENU_TRAINER_TOWER_FLOORS: // Mulitchoice used instead
task->data[6] = 0; task->data[0] = 3;
task->data[15] = taskId; task->data[1] = 3;
break; task->data[2] = 1;
case LISTMENU_TRAINER_TOWER_FLOORS: // Mulitchoice used instead task->data[3] = 1;
task->data[0] = 3; task->data[4] = 8;
task->data[1] = 3; task->data[5] = 6;
task->data[2] = 1; task->data[6] = 0;
task->data[3] = 1; task->data[15] = taskId;
task->data[4] = 8; break;
task->data[5] = 6; case 99:
task->data[6] = 0; break;
task->data[15] = taskId; default:
break; gSpecialVar_Result = 0x7F;
case 99: DestroyTask(taskId);
break; break;
default:
gSpecialVar_Result = 0x7F;
DestroyTask(taskId);
break;
}
} }
} }
@@ -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)
{ {
+667 -600
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 *)r5); SetQuestLogEvent(eventId, (const u16 *)data);
Free(r5); Free(data);
} }
} }
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;
} }
} }
+1131 -1035
View File
File diff suppressed because it is too large Load Diff
+70 -70
View File
@@ -4,95 +4,95 @@
#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));
for (i = 0; i < OBJECT_EVENTS_COUNT; i++) for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{ {
gObjectEvents[i].active = questLogObjectEvents[i].active; gObjectEvents[i].active = questLogObjectEvents[i].active;
gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].triggerGroundEffectsOnStop; gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].triggerGroundEffectsOnStop;
gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].disableCoveringGroundEffects; gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].disableCoveringGroundEffects;
gObjectEvents[i].landingJump = questLogObjectEvents[i].landingJump; gObjectEvents[i].landingJump = questLogObjectEvents[i].landingJump;
gObjectEvents[i].frozen = questLogObjectEvents[i].frozen; gObjectEvents[i].frozen = questLogObjectEvents[i].frozen;
gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].facingDirectionLocked; gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].facingDirectionLocked;
gObjectEvents[i].disableAnim = questLogObjectEvents[i].disableAnim; gObjectEvents[i].disableAnim = questLogObjectEvents[i].disableAnim;
gObjectEvents[i].enableAnim = questLogObjectEvents[i].enableAnim; gObjectEvents[i].enableAnim = questLogObjectEvents[i].enableAnim;
gObjectEvents[i].inanimate = questLogObjectEvents[i].inanimate; gObjectEvents[i].inanimate = questLogObjectEvents[i].inanimate;
gObjectEvents[i].invisible = questLogObjectEvents[i].invisible; gObjectEvents[i].invisible = questLogObjectEvents[i].invisible;
gObjectEvents[i].offScreen = questLogObjectEvents[i].offScreen; gObjectEvents[i].offScreen = questLogObjectEvents[i].offScreen;
gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].trackedByCamera; gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].trackedByCamera;
gObjectEvents[i].isPlayer = questLogObjectEvents[i].isPlayer; gObjectEvents[i].isPlayer = questLogObjectEvents[i].isPlayer;
gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].spriteAnimPausedBackup; gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].spriteAnimPausedBackup;
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;
gObjectEvents[i].mapGroup = questLogObjectEvents[i].mapGroup; gObjectEvents[i].mapGroup = questLogObjectEvents[i].mapGroup;
gObjectEvents[i].currentCoords.x = questLogObjectEvents[i].x; gObjectEvents[i].currentCoords.x = questLogObjectEvents[i].x;
gObjectEvents[i].currentCoords.y = questLogObjectEvents[i].y; gObjectEvents[i].currentCoords.y = questLogObjectEvents[i].y;
gObjectEvents[i].trainerRange_berryTreeId = questLogObjectEvents[i].trainerRange_berryTreeId; gObjectEvents[i].trainerRange_berryTreeId = questLogObjectEvents[i].trainerRange_berryTreeId;
gObjectEvents[i].previousMetatileBehavior = questLogObjectEvents[i].previousMetatileBehavior; gObjectEvents[i].previousMetatileBehavior = questLogObjectEvents[i].previousMetatileBehavior;
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;
} }
+67 -63
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))
DisplayYesNoMenuDefaultYes(); return TRUE;
CreateTask(Task_YesNoMenu_HandleInput, 80);
} DisplayYesNoMenuDefaultYes();
CreateTask(Task_YesNoMenu_HandleInput, 80);
return TRUE; return TRUE;
} }
@@ -915,20 +916,22 @@ 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)
list = sMultichoiceLists[multichoiceId].list; return TRUE;
count = sMultichoiceLists[multichoiceId].count;
width = GetMenuWidthFromList(list, count) + 1; list = sMultichoiceLists[multichoiceId].list;
rowCount = count / columnCount; count = sMultichoiceLists[multichoiceId].count;
taskId = CreateTask(Hask_MultichoiceGridMenu_HandleInput, 80); width = GetMenuWidthFromList(list, count) + 1;
gTasks[taskId].tIgnoreBPress = ignoreBpress; rowCount = count / columnCount;
gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, width * columnCount, rowCount * 2); taskId = CreateTask(Hask_MultichoiceGridMenu_HandleInput, 80);
SetStdWindowBorderStyle(gTasks[taskId].tWindowId, FALSE); gTasks[taskId].tIgnoreBPress = ignoreBpress;
MultichoiceGrid_PrintItems(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, width * 8, 16, columnCount, rowCount, list); gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, width * columnCount, rowCount * 2);
MultichoiceGrid_InitCursor(gTasks[taskId].tWindowId, FONT_NORMAL_COPY_1, 0, 1, width * 8, columnCount, rowCount, 0); SetStdWindowBorderStyle(gTasks[taskId].tWindowId, FALSE);
ScheduleBgCopyTilemapToVram(0); 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);
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,48 +1237,49 @@ 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 (gSpecialVar_0x8005 == 1)
{
if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND)
destinationId = SEAGALLOP_FIVE_ISLAND;
else
destinationId = SEAGALLOP_FOUR_ISLAND;
numItems = 5;
top = 2;
}
else
{
destinationId = SEAGALLOP_VERMILION_CITY;
numItems = 6;
top = 0;
}
cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);
fontHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);
windowId = CreateWindowFromRect(17, top, 11, numItems * 2);
SetStdWindowBorderStyle(windowId, FALSE);
// -2 excludes "Other" and "Exit", appended after the loop
for (i = 0; i < numItems - 2; i++)
{
if (destinationId != gSpecialVar_0x8004)
AddTextPrinterParameterized(windowId, FONT_NORMAL, sSeagallopDestStrings[destinationId], cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);
else
i--;
destinationId++;
// Wrap around if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE)
if (destinationId == SEAGALLOP_SEVEN_ISLAND + 1) return;
destinationId = SEAGALLOP_VERMILION_CITY;
} if (gSpecialVar_0x8005 == 1)
AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Other, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL); {
i++; if (gSpecialVar_0x8004 < SEAGALLOP_FIVE_ISLAND)
AddTextPrinterParameterized(windowId, FONT_NORMAL, gOtherText_Exit, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL); destinationId = SEAGALLOP_FIVE_ISLAND;
Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0); else
CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE); destinationId = SEAGALLOP_FOUR_ISLAND;
ScheduleBgCopyTilemapToVram(0); numItems = 5;
top = 2;
} }
else
{
destinationId = SEAGALLOP_VERMILION_CITY;
numItems = 6;
top = 0;
}
cursorWidth = GetMenuCursorDimensionByFont(FONT_NORMAL, 0);
fontHeight = GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT);
windowId = CreateWindowFromRect(17, top, 11, numItems * 2);
SetStdWindowBorderStyle(windowId, FALSE);
// -2 excludes "Other" and "Exit", appended after the loop
for (i = 0; i < numItems - 2; i++)
{
if (destinationId != gSpecialVar_0x8004)
AddTextPrinterParameterized(windowId, FONT_NORMAL, sSeagallopDestStrings[destinationId], cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);
else
i--;
destinationId++;
// Wrap around
if (destinationId == SEAGALLOP_SEVEN_ISLAND + 1)
destinationId = SEAGALLOP_VERMILION_CITY;
}
AddTextPrinterParameterized(windowId, FONT_NORMAL, gText_Other, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);
i++;
AddTextPrinterParameterized(windowId, FONT_NORMAL, gOtherText_Exit, cursorWidth, i * 16 + 2, TEXT_SKIP_DRAW, NULL);
Menu_InitCursor(windowId, FONT_NORMAL, 0, 2, 16, numItems, 0);
CreateMCMenuInputHandlerTask(FALSE, numItems, windowId, MULTICHOICE_NONE);
ScheduleBgCopyTilemapToVram(0);
} }
u16 GetSelectedSeagallopDestination(void) u16 GetSelectedSeagallopDestination(void)
+51 -54
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;
}
// 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->itemQuantity += quantity;
if (history->itemQuantity > 999)
history->itemQuantity = 999;
} }
if (history->unk4 != 0) // Add to amount of money spent buying or earned selling
if (history->totalMoney < 999999)
{ {
history->unk9 = 1; // logEventId will either be 1 (bought) or 2 (sold)
} // so for buying it will add the full price and selling will add half price
history->totalMoney += (ItemId_GetPrice(itemId) >> (logEventId - 1)) * quantity;
history->unk4 = item; if (history->totalMoney > 999999)
if (history->unk6 < 999) history->totalMoney = 999999;
{
history->unk6 += quantity;
if (history->unk6 > 999)
history->unk6 = 999;
}
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)
v = gShopMenuHistory[0].unkA; SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[0]);
if (v != 0)
SetQuestLogEvent(v + QL_EVENT_USED_POKEMART, (const u16 *)&gShopMenuHistory[0]);
v = gShopMenuHistory[1].unkA; eventId = sHistory[1].logEventId;
if (v != 0) if (eventId != 0)
SetQuestLogEvent(v + QL_EVENT_USED_POKEMART, (const u16 *)&gShopMenuHistory[1]); SetQuestLogEvent(eventId + QL_EVENT_USED_POKEMART, (const u16 *)&sHistory[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++)
+375 -372
View File
File diff suppressed because it is too large Load Diff