diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 200c99086..936ef4dfd 100644 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -260,6 +260,7 @@ #define MOVEMENT_ACTION_JUMP_SPECIAL_WITH_EFFECT_RIGHT 0xA9 #define MOVEMENT_ACTION_STEP_END 0xFE +#define MOVEMENT_ACTION_NONE 0xFF #define ANIM_STD_FACE_SOUTH 0 #define ANIM_STD_FACE_NORTH 1 diff --git a/include/constants/flags.h b/include/constants/flags.h index e4c13dce6..5baa6c75c 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -3,37 +3,45 @@ #include "constants/trainers.h" -#define FLAG_TEMP_1 0x001 -#define FLAG_TEMP_2 0x002 -#define FLAG_TEMP_3 0x003 -#define FLAG_TEMP_4 0x004 -#define FLAG_TEMP_5 0x005 -#define FLAG_TEMP_6 0x006 -#define FLAG_TEMP_7 0x007 -#define FLAG_TEMP_8 0x008 -#define FLAG_TEMP_9 0x009 -#define FLAG_TEMP_A 0x00A -#define FLAG_TEMP_B 0x00B -#define FLAG_TEMP_C 0x00C -#define FLAG_TEMP_D 0x00D -#define FLAG_TEMP_E 0x00E -#define FLAG_TEMP_F 0x00F -#define FLAG_TEMP_10 0x010 -#define FLAG_TEMP_11 0x011 -#define FLAG_TEMP_12 0x012 -#define FLAG_TEMP_13 0x013 -#define FLAG_TEMP_14 0x014 -#define FLAG_TEMP_15 0x015 -#define FLAG_TEMP_16 0x016 -#define FLAG_TEMP_17 0x017 -#define FLAG_TEMP_18 0x018 -#define FLAG_TEMP_19 0x019 -#define FLAG_TEMP_1A 0x01A -#define FLAG_TEMP_1B 0x01B -#define FLAG_TEMP_1C 0x01C -#define FLAG_TEMP_1D 0x01D -#define FLAG_TEMP_1E 0x01E -#define FLAG_TEMP_1F 0x01F +// Temporary Flags +// These temporary flags are are cleared every time a map is loaded. They are used +// for things like shortening an NPCs introduction text if the player already spoke +// to them once. +#define TEMP_FLAGS_START 0x0 +#define FLAG_TEMP_1 (TEMP_FLAGS_START + 0x01) +#define FLAG_TEMP_2 (TEMP_FLAGS_START + 0x02) +#define FLAG_TEMP_3 (TEMP_FLAGS_START + 0x03) +#define FLAG_TEMP_4 (TEMP_FLAGS_START + 0x04) +#define FLAG_TEMP_5 (TEMP_FLAGS_START + 0x05) +#define FLAG_TEMP_6 (TEMP_FLAGS_START + 0x06) +#define FLAG_TEMP_7 (TEMP_FLAGS_START + 0x07) +#define FLAG_TEMP_8 (TEMP_FLAGS_START + 0x08) +#define FLAG_TEMP_9 (TEMP_FLAGS_START + 0x09) +#define FLAG_TEMP_A (TEMP_FLAGS_START + 0x0A) +#define FLAG_TEMP_B (TEMP_FLAGS_START + 0x0B) +#define FLAG_TEMP_C (TEMP_FLAGS_START + 0x0C) +#define FLAG_TEMP_D (TEMP_FLAGS_START + 0x0D) +#define FLAG_TEMP_E (TEMP_FLAGS_START + 0x0E) +#define FLAG_TEMP_F (TEMP_FLAGS_START + 0x0F) +#define FLAG_TEMP_10 (TEMP_FLAGS_START + 0x10) + +// Used for obstacles (e.g. cut trees and rock smash rocks) +#define FLAG_TEMP_11 (TEMP_FLAGS_START + 0x11) +#define FLAG_TEMP_12 (TEMP_FLAGS_START + 0x12) +#define FLAG_TEMP_13 (TEMP_FLAGS_START + 0x13) +#define FLAG_TEMP_14 (TEMP_FLAGS_START + 0x14) +#define FLAG_TEMP_15 (TEMP_FLAGS_START + 0x15) +#define FLAG_TEMP_16 (TEMP_FLAGS_START + 0x16) +#define FLAG_TEMP_17 (TEMP_FLAGS_START + 0x17) +#define FLAG_TEMP_18 (TEMP_FLAGS_START + 0x18) +#define FLAG_TEMP_19 (TEMP_FLAGS_START + 0x19) +#define FLAG_TEMP_1A (TEMP_FLAGS_START + 0x1A) +#define FLAG_TEMP_1B (TEMP_FLAGS_START + 0x1B) +#define FLAG_TEMP_1C (TEMP_FLAGS_START + 0x1C) +#define FLAG_TEMP_1D (TEMP_FLAGS_START + 0x1D) +#define FLAG_TEMP_1E (TEMP_FLAGS_START + 0x1E) +#define FLAG_TEMP_1F (TEMP_FLAGS_START + 0x1F) +#define TEMP_FLAGS_END FLAG_TEMP_1F #define FLAG_0x020 0x020 #define FLAG_0x021 0x021 @@ -1376,8 +1384,8 @@ #define FLAG_SYS_NOT_SOMEONES_PC (SYS_FLAGS + 0x34) #define FLAG_0x835 (SYS_FLAGS + 0x35) #define FLAG_0x836 (SYS_FLAGS + 0x36) -#define FLAG_0x837 (SYS_FLAGS + 0x37) -#define FLAG_0x838 (SYS_FLAGS + 0x38) +#define FLAG_SYS_RESET_RTC_ENABLE (SYS_FLAGS + 0x37) +#define FLAG_0x838 (SYS_FLAGS + 0x38) // Set, never read #define FLAG_SYS_MYSTERY_GIFT_ENABLED (SYS_FLAGS + 0x39) #define FLAG_0x83A (SYS_FLAGS + 0x3A) #define FLAG_SYS_RIBBON_GET (SYS_FLAGS + 0x3B) @@ -1515,13 +1523,11 @@ #define FLAGS_COUNT (FLAG_0x8FF + 1) -// SPECIAL FLAGS (unknown purpose) -#define SPECIAL_FLAGS_START 0x4000 -#define SPECIAL_FLAGS_COUNT 16 -#define FLAG_DONT_SHOW_MAP_NAME_POPUP 0x4000 -#define FLAG_DONT_TRANSITION_MUSIC 0x4001 -#define FLAG_SPECIAL_FLAG_0x4002 0x4002 -#define FLAG_SPECIAL_FLAG_0x4003 0x4003 -#define FLAG_SPECIAL_FLAG_0x4004 0x4004 +// Special Flags (Stored in EWRAM (sSpecialFlags, not in the SaveBlock) +#define SPECIAL_FLAGS_START 0x4000 +#define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0) +#define FLAG_DONT_TRANSITION_MUSIC (SPECIAL_FLAGS_START + 0x1) +// FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused +#define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F) #endif // GUARD_CONSTANTS_FLAGS_H diff --git a/include/constants/vars.h b/include/constants/vars.h index 0a88f6508..56dafee12 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -3,23 +3,25 @@ #define VARS_START 0x4000 -// Temporary variables. Reset on map load. -#define VAR_TEMP_0 0x4000 -#define VAR_TEMP_1 0x4001 -#define VAR_TEMP_2 0x4002 -#define VAR_TEMP_3 0x4003 -#define VAR_TEMP_4 0x4004 -#define VAR_TEMP_5 0x4005 -#define VAR_TEMP_6 0x4006 -#define VAR_TEMP_7 0x4007 -#define VAR_TEMP_8 0x4008 -#define VAR_TEMP_9 0x4009 -#define VAR_TEMP_A 0x400A -#define VAR_TEMP_B 0x400B -#define VAR_TEMP_C 0x400C -#define VAR_TEMP_D 0x400D -#define VAR_TEMP_E 0x400E -#define VAR_TEMP_F 0x400F +// Temporary variables. Temp vars are cleared every time a map is loaded. +#define TEMP_VARS_START 0x4000 +#define VAR_TEMP_0 (TEMP_VARS_START + 0x0) +#define VAR_TEMP_1 (TEMP_VARS_START + 0x1) +#define VAR_TEMP_2 (TEMP_VARS_START + 0x2) +#define VAR_TEMP_3 (TEMP_VARS_START + 0x3) +#define VAR_TEMP_4 (TEMP_VARS_START + 0x4) +#define VAR_TEMP_5 (TEMP_VARS_START + 0x5) +#define VAR_TEMP_6 (TEMP_VARS_START + 0x6) +#define VAR_TEMP_7 (TEMP_VARS_START + 0x7) +#define VAR_TEMP_8 (TEMP_VARS_START + 0x8) +#define VAR_TEMP_9 (TEMP_VARS_START + 0x9) +#define VAR_TEMP_A (TEMP_VARS_START + 0xA) +#define VAR_TEMP_B (TEMP_VARS_START + 0xB) +#define VAR_TEMP_C (TEMP_VARS_START + 0xC) +#define VAR_TEMP_D (TEMP_VARS_START + 0xD) +#define VAR_TEMP_E (TEMP_VARS_START + 0xE) +#define VAR_TEMP_F (TEMP_VARS_START + 0xF) +#define TEMP_VARS_END VAR_TEMP_F // Object event graphics IDs which can be changed by // script commands. @@ -86,7 +88,7 @@ #define VAR_0x4029 0x4029 #define VAR_0x402A 0x402A #define VAR_0x402B 0x402B -#define VAR_RESET_RTC_ENABLE 0x402C +#define VAR_0x402C 0x402C #define VAR_0x402D 0x402D #define VAR_0x402E 0x402E @@ -94,7 +96,7 @@ #define VAR_ICE_STEP_COUNT 0x4030 #define VAR_STARTER_MON 0x4031 // 0: Bulbasaur, 1: Squirtle, 2: Charmander -#define VAR_0x4032 0x4032 +#define VAR_RESET_RTC_ENABLE 0x4032 #define VAR_ENIGMA_BERRY_AVAILABLE 0x4033 #define VAR_0x4034 0x4034 @@ -105,7 +107,7 @@ #define VAR_FANCLUB_LOSE_FAN_TIMER 0x4039 #define VAR_ELEVATOR_FLOOR 0x403A #define VAR_RESORT_GORGEOUS_REWARD 0x403B -#define VAR_0x403C 0x403C +#define VAR_0x403C 0x403C // Set to 0x0302, never read #define VAR_HERACROSS_SIZE_RECORD 0x403D #define VAR_DEOXYS_INTERACTION_NUM 0x403E #define VAR_0x403F 0x403F @@ -158,7 +160,7 @@ #define VAR_MAP_SCENE_PEWTER_CITY 0x406C #define VAR_0x406D 0x406D #define VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE 0x406E -#define VAR_CABLE_CLUB_STATE 0x406F +#define VAR_CABLE_CLUB_STATE 0x406F #define VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY 0x4070 #define VAR_MAP_SCENE_CINNABAR_ISLAND 0x4071 #define VAR_0x4072 0x4072 diff --git a/include/event_data.h b/include/event_data.h index fcad84b6a..5a6f98c6c 100644 --- a/include/event_data.h +++ b/include/event_data.h @@ -52,7 +52,7 @@ void ResetSpecialVars(void); void ResetMysteryEventFlags(void); void ResetMysteryEventVars(void); bool32 IsNationalPokedexEnabled(void); -void sub_806E190(void); +void EnableNationalPokedex_RSE(void); void ClearTempFieldEventData(void); #endif // GUARD_EVENT_DATA_H diff --git a/include/event_object_movement.h b/include/event_object_movement.h index c9c1fe152..814c7b1ad 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -1,9 +1,27 @@ #ifndef GUARD_EVENT_OBJECT_MOVEMENT_H #define GUARD_EVENT_OBJECT_MOVEMENT_H -#include "global.h" - -// Exported struct declarations +// Palette slots for overworld NPCs. +// The same standard set of palettes for overworld objects are normally always loaded at the same +// time while walking around the overworld. The only exceptions are the palettes for the player and +// the "special" NPC, which can be swapped out. This also means that e.g. two "special" NPCs +// with competing palettes cannot be properly loaded at the same time. +enum { + PALSLOT_PLAYER, + PALSLOT_PLAYER_REFLECTION, + PALSLOT_NPC_1, + PALSLOT_NPC_2, + PALSLOT_NPC_3, + PALSLOT_NPC_4, + PALSLOT_NPC_1_REFLECTION, + PALSLOT_NPC_2_REFLECTION, + PALSLOT_NPC_3_REFLECTION, + PALSLOT_NPC_4_REFLECTION, + PALSLOT_NPC_SPECIAL, + PALSLOT_NPC_SPECIAL_REFLECTION, + OBJ_PALSLOT_COUNT + // the remaining sprite palette slots (12-15) are used by field effects, the interface, etc. +}; enum SpinnerRunnerFollowPatterns { @@ -69,15 +87,14 @@ void LoadPlayerObjectReflectionPalette(u16, u8); void LoadSpecialObjectReflectionPalette(u16, u8); void TryMoveObjectEventToMapCoords(u8, u8, u8, s16, s16); void PatchObjectPalette(u16, u8); -void ReloadMapObjectsWithOffset(s16 x, s16 y); +void SpawnObjectEventsOnReturnToField(s16 x, s16 y); void GetMapCoordsFromSpritePos(s16, s16, s16 *, s16 *); u8 GetFaceDirectionAnimNum(u8); void SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16); void ObjectEventClearHeldMovement(struct ObjectEvent *); void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); -void SpawnObjectEventsInView(s16, s16); -u8 CreateVirtualObject(u8, u8, s16, s16, u8, u8); -u8 AddPseudoObjectEvent(u16, SpriteCallback, s16, s16, u8); +u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction); +u8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); int SpawnSpecialObjectEventParameterized(u8, u8, u8, s16, s16, u8); u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); @@ -109,7 +126,7 @@ void MoveCoords(u8, s16 *, s16 *); bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *); u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation); -void sub_8063E28(struct ObjectEvent *, struct Sprite *); +void UpdateQuestLogObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *); bool8 ObjectEventSetHeldMovement(struct ObjectEvent *, u8); void ShiftStillObjectEventCoords(struct ObjectEvent *); void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *, u8); @@ -117,7 +134,7 @@ void SetTrainerMovementType(struct ObjectEvent *, u8); u8 GetFishingDirectionAnimNum(u8 direction); u8 GetFishingNoCatchDirectionAnimNum(u8 a0); void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 a1); -u8 sub_805EB44(u8, u8, s16, s16); +u8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y); void InitObjectEventPalettes(u8 mode); bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent); u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent); @@ -138,7 +155,7 @@ bool8 UpdateWalkSlowerAnim(struct Sprite *sprite); void SetJumpSpriteData(struct Sprite *, u8, u8, u8); u8 DoJumpSpriteMovement(struct Sprite *); u8 DoJumpSpecialSpriteMovement(struct Sprite *); -void TurnVirtualObject(u8, u8); +void TurnVirtualObject(u8 virtualObjId, u8 direction); const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId); u8 GetFirstInactiveObjectEventId(void); u8 GetCollisionFlagsAtCoords(struct ObjectEvent * objectEvent, s16 x, s16 y, u8 direction); @@ -148,25 +165,25 @@ void FreezeObjectEvents(void); bool8 FreezeObjectEvent(struct ObjectEvent *); void UnfreezeObjectEvent(struct ObjectEvent *); void FreezeObjectEventsExceptOne(u8 objEventId); -void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction); -void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible); -bool32 RfuUnionObjectIsInvisible(u8 objectEventId); -void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo); -bool32 RfuUnionObjectIsWarping(u8 objectEventId); +void SetVirtualObjectGraphics(u8 virtualObjId, u8 direction); +void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible); +bool32 IsVirtualObjectInvisible(u8 virtualObjId); +void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo); +bool32 IsVirtualObjectAnimating(u8 virtualObjId); u8 GetJumpSpecialMovementAction(u32 direction); void EnableObjectGroundEffectsByXY(s16 x, s16 y); void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u16 GetObjectPaletteTag(u8 paletteIndex); void SetSpritePosToMapCoords(s16 x, s16 y, s16 *x2, s16 *y2); -void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible); +void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible); u8 ElevationToPriority(u8 elevation); void ObjectEventUpdateElevation(struct ObjectEvent *pObject); void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 offset); -void MakeObjectTemplateFromObjectEventGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables); +void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables); u8 AddCameraObject(u8 trackedSpriteId); void UpdateObjectEventsForCameraUpdate(s16 x, s16 y); -void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *); +void SpriteCB_VirtualObject(struct Sprite *); void SetMovementDelay(struct Sprite *, s16); bool8 WaitForMovementDelay(struct Sprite *); void SetSpriteDataForNormalStep(struct Sprite *, u8, u8); diff --git a/include/global.h b/include/global.h index 05a0e77f1..79dedcdc2 100644 --- a/include/global.h +++ b/include/global.h @@ -183,8 +183,8 @@ struct Pokedex { /*0x00*/ u8 order; /*0x01*/ u8 mode; - /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode - /*0x03*/ u8 unknown2; // set to 0xB9 when national dex is first enabled + /*0x02*/ u8 unused; // set to 0xDA, never read + /*0x03*/ u8 nationalMagic; // set to 0xB9 when national dex is first enabled /*0x04*/ u32 unownPersonality; // set when you first see Unown /*0x08*/ u32 spindaPersonality; // set when you first see Spinda /*0x0C*/ u32 unknown3; diff --git a/src/event_data.c b/src/event_data.c index ac227177d..5d3bad5d6 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -5,6 +5,14 @@ static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1); +#define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) +#define NUM_TEMP_FLAGS (TEMP_FLAGS_END - TEMP_FLAGS_START + 1) +#define NUM_TEMP_VARS (TEMP_VARS_END - TEMP_VARS_START + 1) + +#define SPECIAL_FLAGS_SIZE (NUM_SPECIAL_FLAGS / 8) // 8 flags per byte +#define TEMP_FLAGS_SIZE (NUM_TEMP_FLAGS / 8) +#define TEMP_VARS_SIZE (NUM_TEMP_VARS * 2) // 1/2 var per byte + EWRAM_DATA u16 gSpecialVar_0x8000 = 0; EWRAM_DATA u16 gSpecialVar_0x8001 = 0; EWRAM_DATA u16 gSpecialVar_0x8002 = 0; @@ -25,7 +33,7 @@ EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0; EWRAM_DATA u16 gSpecialVar_TextColor = 0; EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; EWRAM_DATA u16 gSpecialVar_0x8014 = 0; -EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_COUNT] = {}; +EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {}; u16 gLastQuestLogStoredFlagOrVarIdx; @@ -33,15 +41,15 @@ extern u16 *const gSpecialVars[]; void InitEventData(void) { - memset(gSaveBlock1Ptr->flags, 0, NUM_FLAG_BYTES); - memset(gSaveBlock1Ptr->vars, 0, VARS_COUNT * 2); - memset(sSpecialFlags, 0, SPECIAL_FLAGS_COUNT); + memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags)); + memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars)); + memset(sSpecialFlags, 0, sizeof(sSpecialFlags)); } void ClearTempFieldEventData(void) { - memset(gSaveBlock1Ptr->flags, 0, 4); - memset(gSaveBlock1Ptr->vars, 0, 16 * 2); + memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE); + memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_USE_STRENGTH); @@ -49,37 +57,41 @@ void ClearTempFieldEventData(void) FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); } -void sub_806E168(void) // Unused +// Unused +static void DisableNationalPokedex_RSE(void) { u16 *ptr = GetVarPointer(VAR_0x403C); - gSaveBlock2Ptr->pokedex.nationalMagic = 0; + gSaveBlock2Ptr->pokedex.unused = 0; *ptr = 0; FlagClear(FLAG_0x838); } -void sub_806E190(void) +// The magic numbers used here (0xDA and 0x0302) correspond to those +// used in RSE for enabling the national Pokedex +void EnableNationalPokedex_RSE(void) { + // Note: the var, struct member, and flag are never used u16 *ptr = GetVarPointer(VAR_0x403C); - gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA; + gSaveBlock2Ptr->pokedex.unused = 0xDA; *ptr = 0x0302; FlagSet(FLAG_0x838); } -bool32 sub_806E1C0(void) // Unused +// Unused +static bool32 IsNationalPokedexEnabled_RSE(void) { - if (gSaveBlock2Ptr->pokedex.nationalMagic != 0xDA) - return FALSE; - if (VarGet(VAR_0x403C) != 0x0302) - return FALSE; - if (!FlagGet(FLAG_0x838)) - return FALSE; - return TRUE; + if (gSaveBlock2Ptr->pokedex.unused == 0xDA + && VarGet(VAR_0x403C) == 0x0302 + && FlagGet(FLAG_0x838)) + return TRUE; + + return FALSE; } void DisableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2Ptr->pokedex.unknown2 = 0; + gSaveBlock2Ptr->pokedex.nationalMagic = 0; *nationalDexVar = 0; FlagClear(FLAG_SYS_NATIONAL_DEX); } @@ -87,20 +99,19 @@ void DisableNationalPokedex(void) void EnableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2Ptr->pokedex.unknown2 = 0xB9; + gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9; *nationalDexVar = 0x6258; FlagSet(FLAG_SYS_NATIONAL_DEX); } bool32 IsNationalPokedexEnabled(void) { - if (gSaveBlock2Ptr->pokedex.unknown2 != 0xB9) - return FALSE; - if (VarGet(VAR_NATIONAL_DEX) != 0x6258) - return FALSE; - if (!FlagGet(FLAG_SYS_NATIONAL_DEX)) - return FALSE; - return TRUE; + if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xB9 + && VarGet(VAR_NATIONAL_DEX) == 0x6258 + && FlagGet(FLAG_SYS_NATIONAL_DEX)) + return TRUE; + + return FALSE; } void DisableMysteryGift(void) @@ -153,21 +164,21 @@ void ResetMysteryEventVars(void) void DisableResetRTC(void) { - VarSet(VAR_0x4032, 0); - FlagClear(FLAG_0x837); + VarSet(VAR_RESET_RTC_ENABLE, 0); + FlagClear(FLAG_SYS_RESET_RTC_ENABLE); } void EnableResetRTC(void) { - VarSet(VAR_0x4032, 0x0920); - FlagSet(FLAG_0x837); + VarSet(VAR_RESET_RTC_ENABLE, 0x0920); + FlagSet(FLAG_SYS_RESET_RTC_ENABLE); } bool32 CanResetRTC(void) { - if (!FlagGet(FLAG_0x837)) + if (!FlagGet(FLAG_SYS_RESET_RTC_ENABLE)) return FALSE; - if (VarGet(VAR_0x4032) != 0x0920) + if (VarGet(VAR_RESET_RTC_ENABLE) != 0x0920) return FALSE; return TRUE; } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 36b85be4f..0a1fe3bd7 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -19,6 +19,7 @@ #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/trainer_types.h" +#include "constants/union_room.h" static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); @@ -71,7 +72,7 @@ static void GetObjectEventMovingCameraOffset(s16 *, s16 *); static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); -static void ReloadMapObjectWithOffset(u8 objectEventId, s16 x, s16 y); +static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); static void ResetObjectEventFldEffData(struct ObjectEvent *); static u8 TryLoadObjectPalette(const struct SpritePalette *spritePalette); @@ -86,17 +87,17 @@ static void CameraObject_2(struct Sprite *); static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, struct ObjectEventTemplate *templates, u8 count); static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *); static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8); -static bool8 sub_805E238(struct ObjectEventTemplate *, u8, s16, s16); -static bool8 sub_805E27C(struct ObjectEventTemplate *, s16, s16); -static bool8 sub_805E2E8(struct ObjectEventTemplate *, s16, s16); -static void sub_805E384(struct ObjectEventTemplate *); +static bool8 ShouldInitObjectEventStateFromTemplate(struct ObjectEventTemplate *, u8, s16, s16); +static bool8 TemplateIsObstacleAndWithinView(struct ObjectEventTemplate *, s16, s16); +static bool8 TemplateIsObstacleAndVisibleFromConnectingMap(struct ObjectEventTemplate *, s16, s16); +static void SetHideObstacleFlag(struct ObjectEventTemplate *); static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *); static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndStop_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndJump_Callback(struct ObjectEvent *, struct Sprite *); static u8 MovementType_RaiseHandAndSwim_Callback(struct ObjectEvent *, struct Sprite *); -static void sub_8064544(struct ObjectEvent *, struct Sprite *); -static void DoObjectUnionRoomWarpYDisplacement(struct Sprite *sprite); +static void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *); +static void VirtualObject_UpdateAnim(struct Sprite *sprite); static void MovementType_None(struct Sprite *); static void MovementType_LookAround(struct Sprite *); static void MovementType_WanderAround(struct Sprite *); @@ -193,7 +194,20 @@ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprit EWRAM_DATA u8 sCurrentReflectionType = 0; EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; -const u8 gReflectionEffectPaletteMap[16] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; +const u8 gReflectionEffectPaletteMap[16] = { + [PALSLOT_PLAYER] = PALSLOT_PLAYER_REFLECTION, + [PALSLOT_PLAYER_REFLECTION] = PALSLOT_PLAYER_REFLECTION, + [PALSLOT_NPC_1] = PALSLOT_NPC_1_REFLECTION, + [PALSLOT_NPC_2] = PALSLOT_NPC_2_REFLECTION, + [PALSLOT_NPC_3] = PALSLOT_NPC_3_REFLECTION, + [PALSLOT_NPC_4] = PALSLOT_NPC_4_REFLECTION, + [PALSLOT_NPC_1_REFLECTION] = PALSLOT_NPC_1_REFLECTION, + [PALSLOT_NPC_2_REFLECTION] = PALSLOT_NPC_2_REFLECTION, + [PALSLOT_NPC_3_REFLECTION] = PALSLOT_NPC_3_REFLECTION, + [PALSLOT_NPC_4_REFLECTION] = PALSLOT_NPC_4_REFLECTION, + [PALSLOT_NPC_SPECIAL] = PALSLOT_NPC_SPECIAL_REFLECTION, + [PALSLOT_NPC_SPECIAL_REFLECTION] = PALSLOT_NPC_SPECIAL_REFLECTION +}; static const struct SpriteTemplate gCameraSpriteTemplate = { .tileTag = 0, @@ -1195,7 +1209,7 @@ static void ClearObjectEvent(struct ObjectEvent *objectEvent) objectEvent->localId = 0xFF; objectEvent->mapNum = MAP_NUM(UNDEFINED); objectEvent->mapGroup = MAP_GROUP(UNDEFINED); - objectEvent->movementActionId = 0xFF; + objectEvent->movementActionId = MOVEMENT_ACTION_NONE; } static void ClearAllObjectEvents(void) @@ -1300,28 +1314,21 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, struct ObjectEvent *objectEvent; const struct MapHeader *mapHeader; u8 objectEventId; - u8 var0; - u8 localId; s16 x; s16 y; - s16 x2; - s16 y2; - s16 x3; - s16 y3; - - var0 = 0; - localId = 0; - x2 = 0; - y2 = 0; - x3 = 0; - y3 = 0; + bool8 isClone = FALSE; + u8 localId = 0; + s16 x2 = 0; + s16 y2 = 0; + s16 x3 = 0; + s16 y3 = 0; if (template->kind == OBJ_KIND_CLONE) { - var0 = 1; + isClone = TRUE; localId = template->objUnion.clone.targetLocalId; mapNum = template->objUnion.clone.targetMapNum; - mapGroup = template->objUnion.clone.targetMapGroup & 0xFF; + mapGroup = template->objUnion.clone.targetMapGroup; x2 = template->x; y2 = template->y; x3 = template->x; @@ -1329,20 +1336,24 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); template = &(mapHeader->events->objectEvents[localId - 1]); } - if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId) - || !sub_805E238(template, var0, x3, y3)) + + if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)) return OBJECT_EVENTS_COUNT; + + if (!ShouldInitObjectEventStateFromTemplate(template, isClone, x3, y3)) + return OBJECT_EVENTS_COUNT; + objectEvent = &gObjectEvents[objectEventId]; ClearObjectEvent(objectEvent); - if (var0) + if (isClone) { - x = x2 + 7; - y = y2 + 7; + x = x2 + MAP_OFFSET; + y = y2 + MAP_OFFSET; } else { - x = template->x + 7; - y = template->y + 7; + x = template->x + MAP_OFFSET; + y = template->y + MAP_OFFSET; } objectEvent->active = TRUE; objectEvent->triggerGroundEffectsOnMove = TRUE; @@ -1370,110 +1381,87 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, if (gRangedMovementTypes[objectEvent->movementType]) { if (objectEvent->rangeX == 0) - { objectEvent->rangeX++; - } if (objectEvent->rangeY == 0) - { objectEvent->rangeY++; - } } return objectEventId; } -static bool8 sub_805E238(struct ObjectEventTemplate *template, u8 var, s16 x, s16 y) +static bool8 ShouldInitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, bool8 isClone, s16 x, s16 y) { - if (var) - { - if (!sub_805E27C(template, x, y)) - return FALSE; - } - if (!sub_805E2E8(template, x, y)) + if (isClone && !TemplateIsObstacleAndWithinView(template, x, y)) + return FALSE; + + if (!TemplateIsObstacleAndVisibleFromConnectingMap(template, x, y)) return FALSE; return TRUE; } -static bool8 sub_805E27C(struct ObjectEventTemplate *template, s16 x, s16 y) +static bool8 TemplateIsObstacleAndWithinView(struct ObjectEventTemplate *template, s16 x, s16 y) { - if ((u8)(template->graphicsId - OBJ_EVENT_GFX_CUT_TREE) > 1) - return TRUE; - - if (gSaveBlock1Ptr->pos.x < x) + if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK) { - if (gSaveBlock1Ptr->pos.x + 8 < x) - return TRUE; + if (gSaveBlock1Ptr->pos.x < x) + { + if (gSaveBlock1Ptr->pos.x + (MAP_OFFSET + 1) < x) + return TRUE; + if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y) + return FALSE; + } + else + { + if (gSaveBlock1Ptr->pos.x - (MAP_OFFSET + 1) > x) + return TRUE; - if (gSaveBlock1Ptr->pos.y - 6 <= y && gSaveBlock1Ptr->pos.y + 6 >= y) - return FALSE; + if (gSaveBlock1Ptr->pos.y - (MAP_OFFSET - 1) <= y && gSaveBlock1Ptr->pos.y + (MAP_OFFSET - 1) >= y) + return FALSE; + } } - else - { - if (gSaveBlock1Ptr->pos.x - 8 > x) - return TRUE; - - if (gSaveBlock1Ptr->pos.y - 6 <= y && gSaveBlock1Ptr->pos.y + 6 >= y) - return FALSE; - } - return TRUE; } -static bool8 sub_805E2E8(struct ObjectEventTemplate *template, s16 x, s16 y) +static bool8 TemplateIsObstacleAndVisibleFromConnectingMap(struct ObjectEventTemplate *template, s16 unused1, s16 unused2) { - s32 x2, y2; - - if (!IsMapTypeOutdoors(GetCurrentMapType())) - return TRUE; - - x2 = VMap.Xsize - 16; - y2 = VMap.Ysize - 15; - - if ((u8)(template->graphicsId - OBJ_EVENT_GFX_CUT_TREE) > 1) - return TRUE; - - if (!gSaveBlock1Ptr->pos.x) + if (IsMapTypeOutdoors(GetCurrentMapType())) { - if (template->x <= 8) + s32 width = VMap.Xsize - MAP_OFFSET_W - 1; + s32 height = VMap.Ysize - MAP_OFFSET_H - 1; + + if (template->graphicsId == OBJ_EVENT_GFX_CUT_TREE || template->graphicsId == OBJ_EVENT_GFX_ROCK_SMASH_ROCK) { - sub_805E384(template); - return FALSE; + if (gSaveBlock1Ptr->pos.x == 0 && template->x <= (MAP_OFFSET + 1)) + { + SetHideObstacleFlag(template); + return FALSE; + } + + if (gSaveBlock1Ptr->pos.x == width && template->x >= width - (MAP_OFFSET + 1)) + { + SetHideObstacleFlag(template); + return FALSE; + } + + if (gSaveBlock1Ptr->pos.y == 0 && template->y <= (MAP_OFFSET - 1)) + { + SetHideObstacleFlag(template); + return FALSE; + } + + if (gSaveBlock1Ptr->pos.y == height && template->y >= height - (MAP_OFFSET - 1)) + { + SetHideObstacleFlag(template); + return FALSE; + } } } - - if (gSaveBlock1Ptr->pos.x == x2) - { - if (template->x >= x2 - 8) - { - sub_805E384(template); - return FALSE; - } - } - - if (!gSaveBlock1Ptr->pos.y) - { - if (template->y <= 6) - { - sub_805E384(template); - return FALSE; - } - } - - if (gSaveBlock1Ptr->pos.y == y2) - { - if (template->y >= y2 - 6) - { - sub_805E384(template); - return FALSE; - } - } - return TRUE; } -static void sub_805E384(struct ObjectEventTemplate *template) +static void SetHideObstacleFlag(struct ObjectEventTemplate *template) { - if ((u16)(template->flagId - 17) < 15) + if (template->flagId >= FLAG_TEMP_11 && template->flagId <= FLAG_TEMP_1F) FlagSet(template->flagId); } @@ -1575,14 +1563,11 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl objectEvent = &gObjectEvents[objectEventId]; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - if (graphicsInfo->paletteSlot == 0) - { + if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (graphicsInfo->paletteSlot == 10) - { + else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } + if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) objectEvent->invisible = TRUE; @@ -1650,8 +1635,8 @@ int SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 { struct ObjectEventTemplate objectEventTemplate; - x -= 7; - y -= 7; + x -= MAP_OFFSET; + y -= MAP_OFFSET; objectEventTemplate.localId = localId; objectEventTemplate.graphicsId = graphicsId; objectEventTemplate.kind = OBJ_KIND_NORMAL; @@ -1679,7 +1664,7 @@ u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup) return TrySpawnObjectEventTemplate(objectEventTemplate, mapNum, mapGroup, cameraX, cameraY); } -void MakeObjectTemplateFromObjectEventGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) +void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); @@ -1692,7 +1677,7 @@ void MakeObjectTemplateFromObjectEventGraphicsInfo(u16 graphicsId, void (*callba do { - if (ScriptContext_IsEnabled() != TRUE && sub_8112CAC() == TRUE) + if (ScriptContext_IsEnabled() != TRUE && sub_8112CAC() == 1) spriteTemplate->callback = sub_811246C; else spriteTemplate->callback = callback; @@ -1701,27 +1686,27 @@ void MakeObjectTemplateFromObjectEventGraphicsInfo(u16 graphicsId, void (*callba *subspriteTables = graphicsInfo->subspriteTables; } -static void MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) +static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { - MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, sMovementTypeCallbacks[callbackIndex], spriteTemplate, subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, sMovementTypeCallbacks[movementType], spriteTemplate, subspriteTables); } static void MakeObjectTemplateFromObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { - MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEventTemplate->graphicsId, objectEventTemplate->objUnion.normal.movementType, spriteTemplate, subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->objUnion.normal.movementType, spriteTemplate, subspriteTables); } -u8 AddPseudoObjectEvent(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority) +// Used to create a sprite using a graphicsId associated with object events. +u8 CreateObjectGraphicsSprite(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority) { struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; u8 spriteId; - MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, &spriteTemplate, &subspriteTables); if (spriteTemplate.paletteTag != TAG_NONE) - { LoadObjectEventPalette(spriteTemplate.paletteTag); - } + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != MAX_SPRITES && subspriteTables != NULL) { @@ -1731,7 +1716,10 @@ u8 AddPseudoObjectEvent(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u return spriteId; } -u8 CreateVirtualObject(u8 graphicsId, u8 a1, s16 x, s16 y, u8 elevation, u8 direction) +#define sVirtualObjId data[0] +#define sVirtualObjElev data[1] + +u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction) { u8 spriteId; struct Sprite *sprite; @@ -1740,10 +1728,10 @@ u8 CreateVirtualObject(u8 graphicsId, u8 a1, s16 x, s16 y, u8 elevation, u8 dire const struct ObjectEventGraphicsInfo *graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, UpdateObjectEventSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCB_VirtualObject, &spriteTemplate, &subspriteTables); *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - x += 7; - y += 7; + x += MAP_OFFSET; + y += MAP_OFFSET; SetSpritePosToOffsetMapCoords(&x, &y, 8, 16); spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) @@ -1754,12 +1742,10 @@ u8 CreateVirtualObject(u8 graphicsId, u8 a1, s16 x, s16 y, u8 elevation, u8 dire sprite->y += sprite->centerToCornerVecY; sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a1; - sprite->data[1] = elevation; - if (graphicsInfo->paletteSlot == 10) - { + sprite->sVirtualObjId = virtualObjId; + sprite->sVirtualObjElev = elevation; + if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } if (subspriteTables != NULL) { @@ -1773,7 +1759,7 @@ u8 CreateVirtualObject(u8 graphicsId, u8 a1, s16 x, s16 y, u8 elevation, u8 dire return spriteId; } -u8 sub_805EB44(u8 graphicsId, u8 a1, s16 x, s16 y) +u8 CreateFameCheckerObject(u8 graphicsId, u8 localId, s16 x, s16 y) { u8 spriteId; struct Sprite *sprite; @@ -1782,7 +1768,7 @@ u8 sub_805EB44(u8 graphicsId, u8 a1, s16 x, s16 y) const struct ObjectEventGraphicsInfo *graphicsInfo; graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, SpriteCallbackDummy, &spriteTemplate, &subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCallbackDummy, &spriteTemplate, &subspriteTables); *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); @@ -1792,11 +1778,9 @@ u8 sub_805EB44(u8 graphicsId, u8 a1, s16 x, s16 y) sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->y += sprite->centerToCornerVecY; sprite->oam.paletteNum = graphicsInfo->paletteSlot; - sprite->data[0] = a1; - if (graphicsInfo->paletteSlot == 10) - { + sprite->data[0] = localId; + if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } if (subspriteTables != NULL) { @@ -1816,17 +1800,17 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) if (gMapHeader.events != NULL) { s16 left = gSaveBlock1Ptr->pos.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + 17; + s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + 16; + s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; objectCount = gMapHeader.events->objectEventCount; for (i = 0; i < objectCount; i++) { struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; - s16 npcX = template->x + 7; - s16 npcY = template->y + 7; + s16 npcX = template->x + MAP_OFFSET; + s16 npcY = template->y + MAP_OFFSET; if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) @@ -1860,9 +1844,9 @@ void RemoveObjectEventsOutsideView(void) static void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent) { s16 left = gSaveBlock1Ptr->pos.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + 17; + s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + 16; + s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; if (objectEvent->currentCoords.x >= left && objectEvent->currentCoords.x <= right && objectEvent->currentCoords.y >= top && objectEvent->currentCoords.y <= bottom) @@ -1873,7 +1857,7 @@ static void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent) RemoveObjectEvent(objectEvent); } -void ReloadMapObjectsWithOffset(s16 x, s16 y) +void SpawnObjectEventsOnReturnToField(s16 x, s16 y) { u8 i; @@ -1881,14 +1865,12 @@ void ReloadMapObjectsWithOffset(s16 x, s16 y) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) - { - ReloadMapObjectWithOffset(i, x, y); - } + SpawnObjectEventOnReturnToField(i, x, y); } CreateReflectionEffectSprites(); } -static void ReloadMapObjectWithOffset(u8 objectEventId, s16 x, s16 y) +static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) { u8 spriteId; struct Sprite *sprite; @@ -1902,9 +1884,7 @@ static void ReloadMapObjectWithOffset(u8 objectEventId, s16 x, s16 y) for (i = 0; i < NELEMS(gLinkPlayerObjectEvents); i++) { if (gLinkPlayerObjectEvents[i].active && objectEventId == gLinkPlayerObjectEvents[i].objEventId) - { return; - } } #undef i @@ -1913,17 +1893,16 @@ static void ReloadMapObjectWithOffset(u8 objectEventId, s16 x, s16 y) subspriteTables = NULL; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); spriteFrameImage.size = graphicsInfo->size; - MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); + CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; + *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - if (graphicsInfo->paletteSlot == 0) - { + if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - if (graphicsInfo->paletteSlot > 9) - { + + if (graphicsInfo->paletteSlot >= PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } + *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; spriteId = CreateSprite(&spriteTemplate, 0, 0, 0); if (spriteId != MAX_SPRITES) @@ -1941,17 +1920,15 @@ static void ReloadMapObjectWithOffset(u8 objectEventId, s16 x, s16 y) objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); } if (subspriteTables != NULL) - { SetSubspriteTables(sprite, subspriteTables); - } + sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = objectEventId; objectEvent->spriteId = spriteId; if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) - { StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); - } + ResetObjectEventFldEffData(objectEvent); SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1); } @@ -1987,14 +1964,11 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); sprite = &gSprites[objectEvent->spriteId]; - if (graphicsInfo->paletteSlot == 0) - { + if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - if (graphicsInfo->paletteSlot == 10) - { + + if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } var = sprite->images->size / TILE_SIZE_4BPP; if (!sprite->usingSheet) @@ -2159,7 +2133,7 @@ void SetObjectPositionByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, void FreeAndReserveObjectSpritePalettes(void) { FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; + gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT; } static void LoadObjectEventPalette(u16 paletteTag) @@ -2260,9 +2234,10 @@ void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot) } } -u8 sub_805F6D0(u8 var) +// Unused +static u8 GetReflectionEffectPaletteSlot(u8 slot) { - return gReflectionEffectPaletteMap[var]; + return gReflectionEffectPaletteMap[slot]; } // Unused @@ -2313,8 +2288,8 @@ void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s1 u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { - x += 7; - y += 7; + x += MAP_OFFSET; + y += MAP_OFFSET; MoveObjectEventToMapCoords(&gObjectEvents[objectEventId], x, y); } } @@ -2655,8 +2630,8 @@ void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent) objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); if (objectEventTemplate != NULL) { - objectEventTemplate->x = objectEvent->currentCoords.x - 7; - objectEventTemplate->y = objectEvent->currentCoords.y - 7; + objectEventTemplate->x = objectEvent->currentCoords.x - MAP_OFFSET; + objectEventTemplate->y = objectEvent->currentCoords.y - MAP_OFFSET; } } @@ -4294,7 +4269,7 @@ static bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, stru static bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return FALSE; } @@ -4456,7 +4431,7 @@ movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerI static bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return FALSE; } @@ -4672,7 +4647,7 @@ static void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Spr objectEvent->singleMovementActive = FALSE; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; - objectEvent->movementActionId = 0xFF; + objectEvent->movementActionId = MOVEMENT_ACTION_NONE; sprite->data[1] = 0; } @@ -5063,7 +5038,7 @@ bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent) bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent) { - if (objectEvent->heldMovementActive && objectEvent->movementActionId != 0xFF) + if (objectEvent->heldMovementActive && objectEvent->movementActionId != MOVEMENT_ACTION_NONE) return TRUE; return FALSE; @@ -5098,7 +5073,7 @@ void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *objectEvent) void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent) { - objectEvent->movementActionId = 0xFF; + objectEvent->movementActionId = MOVEMENT_ACTION_NONE; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; gSprites[objectEvent->spriteId].data[1] = 0; @@ -5127,21 +5102,19 @@ u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent) if (objectEvent->heldMovementActive) return objectEvent->movementActionId; - return 0xFF; + return MOVEMENT_ACTION_NONE; } void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *)) { DoGroundEffects_OnSpawn(objectEvent, sprite); TryEnableObjectEventAnim(objectEvent, sprite); + if (ObjectEventIsHeldMovementActive(objectEvent)) - { ObjectEventExecHeldMovementAction(objectEvent, sprite); - } else if (!objectEvent->frozen) - { while (callback(objectEvent, sprite)); - } + DoGroundEffects_OnBeginStep(objectEvent, sprite); DoGroundEffects_OnFinishStep(objectEvent, sprite); UpdateObjectEventSpriteAnimPause(objectEvent, sprite); @@ -5149,21 +5122,20 @@ void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sp ObjectEventUpdateSubpriority(objectEvent, sprite); } -void sub_8063E28(struct ObjectEvent *objectEvent, struct Sprite *sprite) +void UpdateQuestLogObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) { DoGroundEffects_OnSpawn(objectEvent, sprite); TryEnableObjectEventAnim(objectEvent, sprite); - if (ObjectEventIsHeldMovementActive(objectEvent)) - { - if(!sprite->animBeginning) - sub_8064544(objectEvent, sprite); - } + + if (ObjectEventIsHeldMovementActive(objectEvent) && !sprite->animBeginning) + QuestLogObjectEventExecHeldMovementAction(objectEvent, sprite); if (MetatileBehavior_IsIce_2(objectEvent->currentMetatileBehavior) == TRUE - || MetatileBehavior_IsTrickHouseSlipperyFloor(objectEvent->currentMetatileBehavior) == TRUE) + || MetatileBehavior_IsTrickHouseSlipperyFloor(objectEvent->currentMetatileBehavior) == TRUE) objectEvent->disableAnim = TRUE; else objectEvent->disableAnim = FALSE; + DoGroundEffects_OnBeginStep(objectEvent, sprite); DoGroundEffects_OnFinishStep(objectEvent, sprite); UpdateObjectEventSpriteAnimPause(objectEvent, sprite); @@ -5269,7 +5241,7 @@ static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, s } } -static void sub_8064544(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void QuestLogObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) { @@ -5283,7 +5255,7 @@ static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent { if (sMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) { - objectEvent->movementActionId = 0xFF; + objectEvent->movementActionId = MOVEMENT_ACTION_NONE; sprite->data[2] = 0; return TRUE; } @@ -6110,7 +6082,7 @@ static bool8 MovementAction_GlideRight_Step1(struct ObjectEvent *objectEvent, st return FALSE; } -void sub_80655A8(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +void FaceDirectionFast(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); @@ -6124,7 +6096,7 @@ u8 MovementAction_FaceDownFast_Step0(struct ObjectEvent *objectEvent, struct Spr StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH)); AnimateSprite(sprite); - sub_80655A8(objectEvent, sprite, DIR_SOUTH); + FaceDirectionFast(objectEvent, sprite, DIR_SOUTH); return TRUE; } @@ -6134,7 +6106,7 @@ u8 MovementAction_FaceUpFast_Step0(struct ObjectEvent *objectEvent, struct Sprit StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH)); AnimateSprite(sprite); - sub_80655A8(objectEvent, sprite, DIR_NORTH); + FaceDirectionFast(objectEvent, sprite, DIR_NORTH); return TRUE; } @@ -6144,7 +6116,7 @@ u8 MovementAction_FaceLeftFast_Step0(struct ObjectEvent *objectEvent, struct Spr StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST)); AnimateSprite(sprite); - sub_80655A8(objectEvent, sprite, DIR_WEST); + FaceDirectionFast(objectEvent, sprite, DIR_WEST); return TRUE; } @@ -6154,7 +6126,7 @@ u8 MovementAction_FaceRightFast_Step0(struct ObjectEvent *objectEvent, struct Sp StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST)); AnimateSprite(sprite); - sub_80655A8(objectEvent, sprite, DIR_EAST); + FaceDirectionFast(objectEvent, sprite, DIR_EAST); return TRUE; } @@ -8796,7 +8768,7 @@ static void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sp } } -bool8 FreezeObjectEvent(struct ObjectEvent * objectEvent) +bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent) { if (objectEvent->heldMovementActive || objectEvent->frozen) return TRUE; @@ -8828,7 +8800,7 @@ void FreezeObjectEventsExceptOne(u8 noFreeze) } } -void UnfreezeObjectEvent(struct ObjectEvent * objectEvent) +void UnfreezeObjectEvent(struct ObjectEvent *objectEvent) { if (objectEvent->active && objectEvent->frozen) { @@ -8848,10 +8820,6 @@ void UnfreezeObjectEvents(void) } } -#define tObjectEventId data[0] -#define tElevation data[1] -#define tInvisible data[2] - #define tDirection data[3] #define tSpeed data[4] #define tStepNo data[5] @@ -9215,7 +9183,7 @@ bool8 SpriteAnimEnded(struct Sprite *sprite) return FALSE; } -void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible) +void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible) { u16 x, y; s16 x2, y2; @@ -9236,53 +9204,51 @@ void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible) x2 = x - (sprite->centerToCornerVecX >> 1); y2 = y - (sprite->centerToCornerVecY >> 1); - if ((s16)x > 255 || x2 < -16) + if ((s16)x >= DISPLAY_WIDTH + 16 || x2 < -16) sprite->invisible = TRUE; - if ((s16)y > 175 || y2 < -16) + if ((s16)y >= DISPLAY_HEIGHT + 16 || y2 < -16) sprite->invisible = TRUE; } -void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *sprite) +#define sInvisible data[2] +#define sAnimNum data[3] +#define sAnimState data[4] + +void SpriteCB_VirtualObject(struct Sprite *sprite) { - DoObjectUnionRoomWarpYDisplacement(sprite); - SetObjectSubpriorityByElevation(sprite->tElevation, sprite, 1); - UpdateObjectEventSpriteVisibility(sprite, sprite->tInvisible); + VirtualObject_UpdateAnim(sprite); + SetObjectSubpriorityByElevation(sprite->sVirtualObjElev, sprite, 1); + UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible); } -void sub_8068FD0(void) +// Unused +static void DestroyVirtualObjects(void) { s32 i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility) - { + if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject) DestroySprite(sprite); - } } } -#define tUnionRoomWarpAnimNo data[3] -#define tUnionRoomWarpAnimState data[4] - -static int GetObjectEventSpriteId(u8 objectEventId) +static int GetVirtualObjectSpriteId(u8 virtualObjId) { int i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility && (u8)sprite->tObjectEventId == objectEventId) - { + if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject && (u8)sprite->sVirtualObjId == virtualObjId) return i; - } } return MAX_SPRITES; } -void TurnVirtualObject(u8 objectEventId, u8 direction) +void TurnVirtualObject(u8 virtualObjId, u8 direction) { u8 animNum; - u8 spriteId = GetObjectEventSpriteId(objectEventId); + u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; @@ -9290,16 +9256,14 @@ void TurnVirtualObject(u8 objectEventId, u8 direction) } } -void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction) +void SetVirtualObjectGraphics(u8 virtualObjId, u8 direction) { - u8 animNum; - int spriteId = GetObjectEventSpriteId(objectEventId); - u16 baseBlock; + int spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; - const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo(direction); - baseBlock = sprite->oam.tileNum; + const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(direction); + u16 baseBlock = sprite->oam.tileNum; sprite->oam = *info->oam; sprite->oam.tileNum = baseBlock; sprite->oam.paletteNum = info->paletteSlot; @@ -9319,110 +9283,110 @@ void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction) } } -void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible) +void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible) { - u8 spriteId = GetObjectEventSpriteId(objectEventId); + u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { if (invisible) - gSprites[spriteId].tInvisible = TRUE; + gSprites[spriteId].sInvisible = TRUE; else - gSprites[spriteId].tInvisible = FALSE; + gSprites[spriteId].sInvisible = FALSE; } } -bool32 RfuUnionObjectIsInvisible(u8 objectEventId) +bool32 IsVirtualObjectInvisible(u8 virtualObjId) { - u8 spriteId = GetObjectEventSpriteId(objectEventId); + u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId == MAX_SPRITES) return FALSE; - return gSprites[spriteId].tInvisible == TRUE; + return gSprites[spriteId].sInvisible == TRUE; } -void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo) +void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNo) { - u8 spriteId = GetObjectEventSpriteId(objectEventId); + u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].tUnionRoomWarpAnimNo = animNo; - gSprites[spriteId].tUnionRoomWarpAnimState = 0; + gSprites[spriteId].sAnimNum = animNo; + gSprites[spriteId].sAnimState = 0; } } -static void DoObjectUnionRoomWarpYDisplacementUpwards(struct Sprite *sprite) +static void MoveUnionRoomObjectUp(struct Sprite *sprite) { - switch (sprite->tUnionRoomWarpAnimState) + switch (sprite->sAnimState) { case 0: sprite->y2 = 0; - sprite->tUnionRoomWarpAnimState++; + sprite->sAnimState++; // fallthrough case 1: - if ((sprite->y2 -= 8) == -160) + if ((sprite->y2 -= 8) == -DISPLAY_HEIGHT) { sprite->y2 = 0; - sprite->tInvisible = 1; - sprite->tUnionRoomWarpAnimNo = 0; - sprite->tUnionRoomWarpAnimState = 0; + sprite->sInvisible = TRUE; + sprite->sAnimNum = 0; + sprite->sAnimState = 0; } break; } } -static void DoObjectUnionRoomWarpYDisplacementDownwards(struct Sprite *sprite) +static void MoveUnionRoomObjectDown(struct Sprite *sprite) { - switch (sprite->tUnionRoomWarpAnimState) + switch (sprite->sAnimState) { case 0: - sprite->y2 = -160; - sprite->tUnionRoomWarpAnimState++; + sprite->y2 = -DISPLAY_HEIGHT; + sprite->sAnimState++; // fallthrough case 1: if ((sprite->y2 += 8) == 0) { - sprite->tUnionRoomWarpAnimNo = 0; - sprite->tUnionRoomWarpAnimState = 0; + sprite->sAnimNum = 0; + sprite->sAnimState = 0; } break; } } -static void DoObjectUnionRoomWarpYDisplacement(struct Sprite *sprite) +static void VirtualObject_UpdateAnim(struct Sprite *sprite) { - switch (sprite->tUnionRoomWarpAnimNo) + switch (sprite->sAnimNum) { - case 0: + case UNION_ROOM_SPAWN_NONE: break; - case 1: - DoObjectUnionRoomWarpYDisplacementDownwards(sprite); + case UNION_ROOM_SPAWN_IN: + MoveUnionRoomObjectDown(sprite); break; - case 2: - DoObjectUnionRoomWarpYDisplacementUpwards(sprite); + case UNION_ROOM_SPAWN_OUT: + MoveUnionRoomObjectUp(sprite); break; default: - sprite->tUnionRoomWarpAnimNo = 0; + sprite->sAnimNum = 0; AGB_ASSERT_EX(0, ABSPATH("evobjmv.c"), 13331); } } -bool32 RfuUnionObjectIsWarping(u8 objectEventId) +bool32 IsVirtualObjectAnimating(u8 virtualObjId) { - u8 spriteId = GetObjectEventSpriteId(objectEventId); + u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); if (spriteId == MAX_SPRITES) return FALSE; - if (gSprites[spriteId].tUnionRoomWarpAnimNo) + if (gSprites[spriteId].sAnimNum) return TRUE; else return FALSE; } -#undef tUnionRoomWarpAnimState -#undef tUnionRoomWarpAnimNo -#undef tInvisible -#undef tElevation -#undef tObjectEventId +#undef sVirtualObjId +#undef sVirtualObjElev +#undef sInvisible +#undef sAnimNum +#undef sAnimState -u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent * objectEvent) +u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent) { ObjectEventGetLocalIdAndMap(objectEvent, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); return FieldEffectStart(fieldEffectId); diff --git a/src/fame_checker.c b/src/fame_checker.c index ba37cdc14..ac19ef373 100644 --- a/src/fame_checker.c +++ b/src/fame_checker.c @@ -1104,7 +1104,7 @@ static bool8 CreateAllFlavorTextIcons(u8 who) { if ((gSaveBlock1Ptr->fameChecker[sFameCheckerData->unlockedPersons[who]].flavorTextFlags >> i) & 1) { - sFameCheckerData->spriteIds[i] = sub_805EB44( + sFameCheckerData->spriteIds[i] = CreateFameCheckerObject( sFameCheckerArrayNpcGraphicsIds[sFameCheckerData->unlockedPersons[who] * 6 + i], i, 47 * (i % 3) + 0x72, diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 5b791af40..7a9a59f66 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -331,7 +331,7 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite) if (sprite->animCmdIndex == 0) metatileBehavior = 4; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], metatileBehavior); } } @@ -434,7 +434,7 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) { sprite->data[7] = TRUE; } - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); UpdateGrassFieldEffectSubpriority(sprite, sprite->data[0], 0); } } @@ -513,7 +513,7 @@ void UpdateShortGrassFieldEffect(struct Sprite *sprite) sprite->y2 = (graphicsInfo->height >> 1) - 8; sprite->subpriority = linkedSprite->subpriority - 1; sprite->oam.priority = linkedSprite->oam.priority; - UpdateObjectEventSpriteVisibility(sprite, linkedSprite->invisible); + UpdateObjectEventSpriteInvisibility(sprite, linkedSprite->invisible); } } @@ -587,14 +587,14 @@ static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite) if (++sprite->data[1] > 40) sprite->data[0] = 1; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite) { sprite->invisible ^= 1; sprite->data[1]++; - UpdateObjectEventSpriteVisibility(sprite, sprite->invisible); + UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible); if (sprite->data[1] > 56) { FieldEffectStop(sprite, sprite->data[7]); @@ -641,7 +641,7 @@ void UpdateSplashFieldEffect(struct Sprite *sprite) { sprite->x = gSprites[gObjectEvents[objectEventId].spriteId].x; sprite->y = gSprites[gObjectEvents[objectEventId].spriteId].y; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -727,7 +727,7 @@ static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite) sprite->x = linkedSprite->x; sprite->y = linkedSprite->y; sprite->subpriority = linkedSprite->subpriority; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4]) { sprite->data[3] = objectEvent->currentCoords.x; @@ -797,7 +797,7 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) sprite->x = linkedSprite->x; sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 8; sprite->subpriority = linkedSprite->subpriority - 1; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -935,7 +935,7 @@ static void UpdateAshFieldEffect_Step1(struct Sprite *sprite) static void UpdateAshFieldEffect_Step2(struct Sprite *sprite) { - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->animEnded) FieldEffectStop(sprite, FLDEFF_ASH); } @@ -1187,7 +1187,7 @@ void UpdateSandPileFieldEffect(struct Sprite *sprite) sprite->x = x; sprite->y = y; sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -1212,7 +1212,7 @@ void UpdateBubblesFieldEffect(struct Sprite *sprite) sprite->data[0] += 0x80; sprite->data[0] &= 0x100; sprite->y -= sprite->data[0] >> 8; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->invisible || sprite->animEnded) { FieldEffectStop(sprite, FLDEFF_BUBBLES); @@ -1380,7 +1380,7 @@ void UpdateJumpImpactEffect(struct Sprite *sprite) } else { - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); SetObjectSubpriorityByElevation(sprite->data[0], sprite, 0); } } @@ -1390,7 +1390,7 @@ void WaitFieldEffectSpriteAnim(struct Sprite *sprite) if (sprite->animEnded) FieldEffectStop(sprite, sprite->data[0]); else - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset) diff --git a/src/naming_screen.c b/src/naming_screen.c index 514629ae4..32d1bd087 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1393,7 +1393,7 @@ static void NamingScreen_CreatePlayerIcon(void) u8 spriteId; rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, sNamingScreen->monSpecies); - spriteId = AddPseudoObjectEvent(rivalGfxId, SpriteCallbackDummy, 56, 37, 0); + spriteId = CreateObjectGraphicsSprite(rivalGfxId, SpriteCallbackDummy, 56, 37, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH); } @@ -1440,7 +1440,7 @@ static void NamingScreen_CreateRivalIcon(void) const struct SubspriteTable * tables_p; u8 spriteId; - MakeObjectTemplateFromObjectEventGraphicsInfo(OBJ_EVENT_GFX_RED_NORMAL, SpriteCallbackDummy, &template, &tables_p); + CopyObjectGraphicsInfoToSpriteTemplate(OBJ_EVENT_GFX_RED_NORMAL, SpriteCallbackDummy, &template, &tables_p); template.tileTag = sheet.tag; template.paletteTag = palette.tag; diff --git a/src/new_game.c b/src/new_game.c index 0bd25b23c..d6400d763 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -130,7 +130,7 @@ void NewGameInitData(void) ClearPlayerLinkBattleRecords(); InitHeracrossSizeRecord(); InitMagikarpSizeRecord(); - sub_806E190(); + EnableNationalPokedex_RSE(); gPlayerPartyCount = 0; ZeroPlayerPartyMons(); ResetPokemonStorageSystem(); diff --git a/src/overworld.c b/src/overworld.c index 8a99ea519..8c6037ca3 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -2138,7 +2138,7 @@ static void InitObjectEventsLocal(void) static void ReloadObjectsAndRunReturnToFieldMapScript(void) { - ReloadMapObjectsWithOffset(0, 0); + SpawnObjectEventsOnReturnToField(0, 0); RunOnReturnToFieldMapScript(); } @@ -3515,13 +3515,13 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) { if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN) { - objEvent->spriteId = AddPseudoObjectEvent( + objEvent->spriteId = CreateObjectGraphicsSprite( GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); } else { - objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); + objEvent->spriteId = CreateObjectGraphicsSprite(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0); } sprite = &gSprites[objEvent->spriteId]; @@ -3545,7 +3545,7 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite) else StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent))); - UpdateObjectEventSpriteVisibility(sprite, 0); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (objEvent->triggerGroundEffectsOnMove) { sprite->invisible = ((sprite->data[7] & 4) >> 2); diff --git a/src/quest_log.c b/src/quest_log.c index a041aeb6d..e2d55f544 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -1297,7 +1297,7 @@ void sub_811246C(struct Sprite *sprite) QuestLogUpdatePlayerSprite(sMovementScripts[0][1]); sMovementScripts[0][1] = 0xFF; } - sub_8063E28(objectEvent, sprite); + UpdateQuestLogObjectEventCurrentMovement(objectEvent, sprite); } else { @@ -1306,7 +1306,7 @@ void sub_811246C(struct Sprite *sprite) ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]); sMovementScripts[objectEvent->localId][0] = 0xFF; } - sub_8063E28(objectEvent, sprite); + UpdateQuestLogObjectEventCurrentMovement(objectEvent, sprite); } } diff --git a/src/rfu_union_tool.c b/src/rfu_union_tool.c index f8ad88d9a..0d5180e0f 100644 --- a/src/rfu_union_tool.c +++ b/src/rfu_union_tool.c @@ -441,7 +441,7 @@ void CreateGroupMemberObjectsInvisible(u8 * sprite_ids, s32 group) { s32 obj_id = 5 * group + i; sprite_ids[obj_id] = CreateVirtualObject(OBJ_EVENT_GFX_MAN, obj_id - 0x38, sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[i][0], sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[i][1], 3, 1); - RfuUnionObjectToggleInvisibility(obj_id - 0x38, TRUE); + SetVirtualObjectInvisibility(obj_id - 0x38, TRUE); } } @@ -485,7 +485,7 @@ static u8 UnionPartnerObjectGetFacing(u32 member, u32 group, struct GFtgtGname * static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member) { - return RfuUnionObjectIsInvisible(5 * group + member - 0x38); + return IsVirtualObjectInvisible(5 * group + member - 0x38); } static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFtgtGname * gname) @@ -494,10 +494,10 @@ static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFt s32 objId = 5 * groupNo + memberNo; if (RfuUnionGroupMemberIsInvisible(groupNo, memberNo) == TRUE) { - RfuUnionObjectToggleInvisibility(objId - 0x38, FALSE); - RfuUnionObjectStartWarp(objId - 0x38, UNION_ROOM_SPAWN_IN); + SetVirtualObjectInvisibility(objId - 0x38, FALSE); + SetVirtualObjectSpriteAnim(objId - 0x38, UNION_ROOM_SPAWN_IN); } - RfuUnionObjectSetFacingDirection(objId - 0x38, direction); + SetVirtualObjectGraphics(objId - 0x38, direction); UnionPartnerObjectSetFacing(memberNo, groupNo, UnionPartnerObjectGetFacing(memberNo, groupNo, gname)); GetUnionRoomPlayerFacingCoords(groupNo, memberNo, &x, &y); MapGridSetMetatileImpassabilityAt(x, y, TRUE); @@ -506,7 +506,7 @@ static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFt static void DespawnGroupMember(u32 group, u32 member) { s32 x, y; - RfuUnionObjectStartWarp(5 * group + member - 0x38, UNION_ROOM_SPAWN_OUT); + SetVirtualObjectSpriteAnim(5 * group + member - 0x38, UNION_ROOM_SPAWN_OUT); GetUnionRoomPlayerFacingCoords(group, member, &x, &y); MapGridSetMetatileImpassabilityAt(x, y, FALSE); } @@ -518,7 +518,7 @@ static void AssembleGroup(u32 group, struct GFtgtGname * gname) PlayerGetDestCoords(&x, &y); player_get_pos_including_state_based_drift(&x2, &y2); - if (RfuUnionObjectIsInvisible(5 * group - 0x38) == TRUE) + if (IsVirtualObjectInvisible(5 * group - 0x38) == TRUE) { if (IsUnionRoomPlayerFacingTileAt(group, 0, x, y) == TRUE || IsUnionRoomPlayerFacingTileAt(group, 0, x2, y2) == TRUE) { @@ -631,11 +631,11 @@ bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *mai { continue; } - if (RfuUnionObjectIsInvisible(objId - 0x38) != 0) + if (IsVirtualObjectInvisible(objId - 0x38) != FALSE) { continue; } - if (RfuUnionObjectIsWarping(objId - 0x38) != 0) + if (IsVirtualObjectAnimating(objId - 0x38) != FALSE) { continue; } diff --git a/src/shop.c b/src/shop.c index eee6ff70e..a81e6e824 100644 --- a/src/shop.c +++ b/src/shop.c @@ -844,7 +844,7 @@ static void BuyMenuDrawObjectEvents(void) continue; graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId); - spriteId = AddPseudoObjectEvent( + spriteId = CreateObjectGraphicsSprite( gObjectEvents[sViewportObjectEvents[i][OBJECT_EVENT_ID]].graphicsId, SpriteCallbackDummy, (u16)sViewportObjectEvents[i][X_COORD] * 16 - 8, diff --git a/src/teachy_tv.c b/src/teachy_tv.c index 3c3729d04..93134bcd2 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -26,6 +26,7 @@ #include "fieldmap.h" #include "strings.h" #include "constants/field_effects.h" +#include "constants/event_objects.h" struct TeachyTvCtrlBlk { @@ -602,7 +603,7 @@ static void TeachyTvInitIo(void) static u8 TeachyTvSetupObjEventAndOam(void) { - u8 objId = AddPseudoObjectEvent(90, SpriteCallbackDummy, 0, 0, 8); + u8 objId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_TEACHY_TV_HOST, SpriteCallbackDummy, 0, 0, 8); gSprites[objId].oam.priority = 2; gSprites[objId].invisible = 1; return objId;