Document camera sprite functions

This commit is contained in:
GriffinR
2023-11-16 13:08:47 -05:00
parent 959623f82e
commit 2db9ab2a2f
5 changed files with 78 additions and 72 deletions
+51 -51
View File
@@ -144,9 +144,9 @@ static u8 FindObjectEventPaletteIndexByTag(u16);
static void _PatchObjectPalette(u16, u8);
static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8);
static void SpriteCB_CameraObject(struct Sprite *);
static void CameraObject_0(struct Sprite *);
static void CameraObject_1(struct Sprite *);
static void CameraObject_2(struct Sprite *);
static void CameraObject_Init(struct Sprite *);
static void CameraObject_UpdateMove(struct Sprite *);
static void CameraObject_UpdateFrozen(struct Sprite *);
static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, const struct ObjectEventTemplate *, u8);
static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *);
static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);
@@ -193,10 +193,16 @@ static const struct SpriteTemplate sCameraSpriteTemplate = {
.callback = SpriteCB_CameraObject
};
enum {
CAMERA_STATE_INIT,
CAMERA_STATE_MOVE,
CAMERA_STATE_FROZEN,
};
static void (*const sCameraObjectFuncs[])(struct Sprite *) = {
CameraObject_0,
CameraObject_1,
CameraObject_2,
[CAMERA_STATE_INIT] = CameraObject_Init,
[CAMERA_STATE_MOVE] = CameraObject_UpdateMove,
[CAMERA_STATE_FROZEN] = CameraObject_UpdateFrozen,
};
#include "data/object_events/object_event_graphics.h"
@@ -1836,7 +1842,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
sprite->x += 8;
sprite->y += 16 + sprite->centerToCornerVecY;
if (objectEvent->trackedByCamera)
CameraObjectReset1();
CameraObjectReset();
}
void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
@@ -2128,7 +2134,7 @@ void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y)
sprite->y += 16 + sprite->centerToCornerVecY;
ResetObjectEventFldEffData(objectEvent);
if (objectEvent->trackedByCamera)
CameraObjectReset1();
CameraObjectReset();
}
void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
@@ -2204,15 +2210,15 @@ void UpdateObjectEventsForCameraUpdate(s16 x, s16 y)
RemoveObjectEventsOutsideView();
}
#define sLinkedSpriteId data[0]
#define sState data[1]
u8 AddCameraObject(u8 linkedSpriteId)
// The "CameraObject" functions below are responsible for an invisible sprite
// that follows the movements of a different sprite (normally the player's sprite)
// and tracks x/y movement distances for the camera so it knows where to move.
u8 AddCameraObject(u8 followSpriteId)
{
u8 spriteId = CreateSprite(&sCameraSpriteTemplate, 0, 0, 4);
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].sLinkedSpriteId = linkedSpriteId;
gSprites[spriteId].sCamera_FollowSpriteId = followSpriteId;
return spriteId;
}
@@ -2221,35 +2227,37 @@ static void SpriteCB_CameraObject(struct Sprite *sprite)
void (*callbacks[ARRAY_COUNT(sCameraObjectFuncs)])(struct Sprite *);
memcpy(callbacks, sCameraObjectFuncs, sizeof sCameraObjectFuncs);
callbacks[sprite->sState](sprite);
callbacks[sprite->sCamera_State](sprite);
}
static void CameraObject_0(struct Sprite *sprite)
static void CameraObject_Init(struct Sprite *sprite)
{
sprite->x = gSprites[sprite->sLinkedSpriteId].x;
sprite->y = gSprites[sprite->sLinkedSpriteId].y;
sprite->x = gSprites[sprite->sCamera_FollowSpriteId].x;
sprite->y = gSprites[sprite->sCamera_FollowSpriteId].y;
sprite->invisible = TRUE;
sprite->sState = 1;
CameraObject_1(sprite);
sprite->sCamera_State = CAMERA_STATE_MOVE;
CameraObject_UpdateMove(sprite);
}
static void CameraObject_1(struct Sprite *sprite)
static void CameraObject_UpdateMove(struct Sprite *sprite)
{
s16 x = gSprites[sprite->sLinkedSpriteId].x;
s16 y = gSprites[sprite->sLinkedSpriteId].y;
s16 x = gSprites[sprite->sCamera_FollowSpriteId].x;
s16 y = gSprites[sprite->sCamera_FollowSpriteId].y;
sprite->data[2] = x - sprite->x;
sprite->data[3] = y - sprite->y;
sprite->sCamera_MoveX = x - sprite->x;
sprite->sCamera_MoveY = y - sprite->y;
sprite->x = x;
sprite->y = y;
}
static void CameraObject_2(struct Sprite *sprite)
// Invisible sprite will continue to follow the parent sprite,
// but no corresponding camera movement will be shown.
static void CameraObject_UpdateFrozen(struct Sprite *sprite)
{
sprite->x = gSprites[sprite->sLinkedSpriteId].x;
sprite->y = gSprites[sprite->sLinkedSpriteId].y;
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->x = gSprites[sprite->sCamera_FollowSpriteId].x;
sprite->y = gSprites[sprite->sCamera_FollowSpriteId].y;
sprite->sCamera_MoveX = 0;
sprite->sCamera_MoveY = 0;
}
static struct Sprite *FindCameraSprite(void)
@@ -2264,51 +2272,43 @@ static struct Sprite *FindCameraSprite(void)
return NULL;
}
void CameraObjectReset1(void)
void CameraObjectReset(void)
{
struct Sprite *camera;
camera = FindCameraSprite();
struct Sprite *camera = FindCameraSprite();
if (camera != NULL)
{
camera->sState = 0;
camera->sCamera_State = CAMERA_STATE_INIT;
camera->callback(camera);
}
}
void CameraObjectSetFollowedSpriteId(u8 spriteId)
{
struct Sprite *camera;
camera = FindCameraSprite();
struct Sprite *camera = FindCameraSprite();
if (camera != NULL)
{
camera->sLinkedSpriteId = spriteId;
CameraObjectReset1();
camera->sCamera_FollowSpriteId = spriteId;
CameraObjectReset();
}
}
static u8 UNUSED CameraObjectGetFollowedSpriteId(void)
{
struct Sprite *camera;
camera = FindCameraSprite();
struct Sprite *camera = FindCameraSprite();
if (camera == NULL)
return MAX_SPRITES;
return camera->sLinkedSpriteId;
return camera->sCamera_FollowSpriteId;
}
void CameraObjectReset2(void)
void CameraObjectFreeze(void)
{
// UB: Possible null dereference
#ifdef UBFIX
struct Sprite *camera = FindCameraSprite();
if (camera)
camera->sState = 2;
#else
FindCameraSprite()->sState = 2;
#endif // UBFIX
#ifdef UBFIX // Possible null dereference
if (camera == NULL)
return;
#endif
camera->sCamera_State = CAMERA_STATE_FROZEN;
}
u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)