From 8998b19435b823b9db12529648265bfb47ecfe65 Mon Sep 17 00:00:00 2001 From: cbt6 <91667135+cbt6@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:53:37 +0800 Subject: [PATCH] Document src/event_object_movement.c --- include/constants/event_object_movement.h | 1 + include/event_object_movement.h | 53 ++- src/event_object_movement.c | 508 ++++++++++------------ src/fame_checker.c | 2 +- src/field_effect_helpers.c | 26 +- src/naming_screen.c | 4 +- src/overworld.c | 8 +- src/quest_log.c | 4 +- src/rfu_union_tool.c | 18 +- src/shop.c | 2 +- src/teachy_tv.c | 2 +- 11 files changed, 305 insertions(+), 323 deletions(-) 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/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/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/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..ed90dc7cb 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -602,7 +602,7 @@ static void TeachyTvInitIo(void) static u8 TeachyTvSetupObjEventAndOam(void) { - u8 objId = AddPseudoObjectEvent(90, SpriteCallbackDummy, 0, 0, 8); + u8 objId = CreateObjectGraphicsSprite(90, SpriteCallbackDummy, 0, 0, 8); gSprites[objId].oam.priority = 2; gSprites[objId].invisible = 1; return objId;