Document camera sprite functions
This commit is contained in:
+51
-51
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user