diff options
Diffstat (limited to 'src/event_object_movement.c')
-rw-r--r-- | src/event_object_movement.c | 234 |
1 files changed, 124 insertions, 110 deletions
diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 21351434a..16b6e110e 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1,17 +1,17 @@ #include "global.h" -#include "event_object_movement.h" #include "berry.h" #include "event_data.h" +#include "event_object_movement.h" #include "field_camera.h" #include "field_effect.h" #include "field_effect_helpers.h" #include "field_player_avatar.h" #include "fieldmap.h" +#include "metatile_behavior.h" +#include "overworld.h" #include "palette.h" #include "random.h" -#include "overworld.h" #include "sprite.h" -#include "metatile_behavior.h" #include "trainer_see.h" #include "constants/field_effects.h" #include "constants/maps.h" @@ -62,6 +62,14 @@ static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8, struct E static void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *); static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); static void CreateReflectionEffectSprites(void); +static u8 GetEventObjectIdByLocalIdAndMapInternal(u8, u8, u8); +static u8 GetEventObjectIdByLocalId(u8); +static void RemoveEventObjectInternal(struct EventObject *); +static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables); +static void RemoveEventObjectIfOutsideView(struct EventObject *eventObject); + +extern void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8); +extern void sub_805B914(struct EventObject *); const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; @@ -988,7 +996,7 @@ static void ClearAllEventObjects(void) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) ClearEventObject(&gEventObjects[i]); #if DEBUG gUnknown_Debug_03004BC0 = 0; @@ -1014,19 +1022,19 @@ static void CreateReflectionEffectSprites(void) gSprites[spriteId].oam.affineMode = 1; InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = 1; + gSprites[spriteId].invisible = TRUE; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); gSprites[spriteId].oam.affineMode = 1; InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = 1; + gSprites[spriteId].invisible = TRUE; } u8 GetFirstInactiveEventObjectId(void) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (!gEventObjects[i].active) break; @@ -1037,7 +1045,7 @@ u8 GetFirstInactiveEventObjectId(void) u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - if (localId < 255) + if (localId < 0xFF) return GetEventObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); else return GetEventObjectIdByLocalId(localId); @@ -1046,7 +1054,7 @@ u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *eventObjectId) { *eventObjectId = GetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); - if (*eventObjectId == 16) + if (*eventObjectId == EVENT_OBJECTS_COUNT) return TRUE; else return FALSE; @@ -1055,7 +1063,7 @@ bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 u8 GetEventObjectIdByXY(s16 x, s16 y) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (gEventObjects[i].active && gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y) break; @@ -1064,31 +1072,31 @@ u8 GetEventObjectIdByXY(s16 x, s16 y) return i; } -u8 GetEventObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) +static u8 GetEventObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup) return i; } - return 16; + return EVENT_OBJECTS_COUNT; } -u8 GetEventObjectIdByLocalId(u8 localId) +static u8 GetEventObjectIdByLocalId(u8 localId) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (gEventObjects[i].active && gEventObjects[i].localId == localId) return i; } - return 16; + return EVENT_OBJECTS_COUNT; } -u8 TryInitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapNum, u8 mapGroup) +static u8 TryInitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapNum, u8 mapGroup) { struct EventObject *eventObj; u8 eventObjectId; @@ -1165,23 +1173,23 @@ u8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *eventObjec { u8 i = 0; - for (i = 0; i < 16 && gEventObjects[i].active; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT && gEventObjects[i].active; i++) { if (gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup) - return 1; + return TRUE; } - if (i >= 16) - return 1; + if (i >= EVENT_OBJECTS_COUNT) + return TRUE; *eventObjectId = i; - for (; i < 16; i++) + for (; i < EVENT_OBJECTS_COUNT; i++) { if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup) - return 1; + return TRUE; } - return 0; + return FALSE; } -void RemoveEventObject(struct EventObject *eventObject) +static void RemoveEventObject(struct EventObject *eventObject) { eventObject->active = FALSE; RemoveEventObjectInternal(eventObject); @@ -1200,7 +1208,7 @@ void RemoveEventObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) } } -void RemoveEventObjectInternal(struct EventObject *eventObject) +static void RemoveEventObjectInternal(struct EventObject *eventObject) { struct SpriteFrameImage image; image.size = GetEventObjectGraphicsInfo(eventObject->graphicsId)->size; @@ -1212,7 +1220,7 @@ void RemoveAllEventObjectsExceptPlayer(void) { u8 i; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (i != gPlayerAvatar.eventObjectId) RemoveEventObject(&gEventObjects[i]); @@ -1223,21 +1231,24 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjTemplate { u8 eventObjectId; u8 spriteId; - const struct EventObjectGraphicsInfo *gfxInfo; + const struct EventObjectGraphicsInfo *graphicsInfo; struct EventObject *eventObject; struct Sprite *sprite; eventObjectId = TryInitEventObjectStateFromTemplate(eventObjTemplate, mapNum, mapGroup); - if (eventObjectId == 16) - return 16; + if (eventObjectId == EVENT_OBJECTS_COUNT) + return EVENT_OBJECTS_COUNT; eventObject = &gEventObjects[eventObjectId]; - gfxInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); - if (gfxInfo->paletteSlot == 0) - LoadPlayerObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot); - else if (gfxInfo->paletteSlot == 10) - LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot); - + graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + if (graphicsInfo->paletteSlot == 0) + { + LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); + } + else if (graphicsInfo->paletteSlot == 10) + { + LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); + } if (eventObject->movementType == MOVEMENT_TYPE_INVISIBLE) eventObject->invisible = TRUE; @@ -1257,15 +1268,15 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjTemplate } sprite = &gSprites[spriteId]; sub_8060388(cameraDeltaX + eventObject->currentCoords.x, cameraDeltaY + eventObject->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->pos1.x += 8; sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = eventObjectId; eventObject->spriteId = spriteId; - eventObject->inanimate = gfxInfo->inanimate; + eventObject->inanimate = graphicsInfo->inanimate; if (!eventObject->inanimate) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection)); SetObjectSubpriorityByZCoord(eventObject->previousElevation, sprite, 1); @@ -1273,67 +1284,74 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjTemplate return eventObjectId; } -u8 TrySpawnEventObject(struct EventObjectTemplate *eventObjTemplate, u8 mapNum, u8 mapGroup, s16 cameraDeltaX, s16 cameraDeltaY) +static u8 TrySpawnEventObject(struct EventObjectTemplate *eventObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraDeltaX, s16 cameraDeltaY) { + struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables = NULL; struct SpriteFrameImage spriteFrameImage; - const struct EventObjectGraphicsInfo *gfxInfo; + const struct EventObjectGraphicsInfo *graphicsInfo; u8 eventObjectId; - gfxInfo = GetEventObjectGraphicsInfo(eventObjTemplate->graphicsId); - MakeObjectTemplateFromEventObjectTemplate(eventObjTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = gfxInfo->size; + graphicsInfo = GetEventObjectGraphicsInfo(eventObjectTemplate->graphicsId); + MakeObjectTemplateFromEventObjectTemplate(eventObjectTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = graphicsInfo->size; spriteTemplate.images = &spriteFrameImage; - eventObjectId = TrySetupEventObjectSprite(eventObjTemplate, &spriteTemplate, mapNum, mapGroup, cameraDeltaX, cameraDeltaY); - if (eventObjectId == 16) - return 16; - gSprites[gEventObjects[eventObjectId].spriteId].images = gfxInfo->images; + eventObjectId = TrySetupEventObjectSprite(eventObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraDeltaX, cameraDeltaY); + if (eventObjectId == EVENT_OBJECTS_COUNT) + { + return EVENT_OBJECTS_COUNT; + } + gSprites[gEventObjects[eventObjectId].spriteId].images = graphicsInfo->images; if (subspriteTables != NULL) + { SetSubspriteTables(&gSprites[gEventObjects[eventObjectId].spriteId], subspriteTables); + } return eventObjectId; } -u8 SpawnSpecialEventObject(struct EventObjectTemplate *eventObjTemplate) +u8 SpawnSpecialEventObject(struct EventObjectTemplate *eventObjectTemplate) { s16 x; s16 y; GetEventObjectMovingCameraOffset(&x, &y); - return TrySpawnEventObject(eventObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); + return TrySpawnEventObject(eventObjectTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); } u8 SpawnSpecialEventObjectParametrized(u8 graphicsId, u8 movementType, u8 localId, s16 x, s16 y, u8 elevation) { - struct EventObjectTemplate eventObjTemplate; + struct EventObjectTemplate eventObjectTemplate; x -= 7; y -= 7; - eventObjTemplate.localId = localId; - eventObjTemplate.graphicsId = graphicsId; - eventObjTemplate.unk2 = 0; - eventObjTemplate.x = x; - eventObjTemplate.y = y; - eventObjTemplate.elevation = elevation; - eventObjTemplate.movementType = movementType; - eventObjTemplate.movementRangeX = 0; - eventObjTemplate.movementRangeY = 0; - eventObjTemplate.trainerType = 0; - eventObjTemplate.trainerRange_berryTreeId = 0; - return SpawnSpecialEventObject(&eventObjTemplate); -} - -u8 show_sprite(u8 a, u8 b, u8 c) -{ - struct EventObjectTemplate *r5; + eventObjectTemplate.localId = localId; + eventObjectTemplate.graphicsId = graphicsId; + eventObjectTemplate.unk2 = 0; + eventObjectTemplate.x = x; + eventObjectTemplate.y = y; + eventObjectTemplate.elevation = elevation; + eventObjectTemplate.movementType = movementType; + eventObjectTemplate.movementRangeX = 0; + eventObjectTemplate.movementRangeY = 0; + eventObjectTemplate.trainerType = 0; + eventObjectTemplate.trainerRange_berryTreeId = 0; + return SpawnSpecialEventObject(&eventObjectTemplate); +} + +u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct EventObjectTemplate *eventObjectTemplate; s16 x; s16 y; - r5 = GetEventObjectTemplateByLocalIdAndMap(a, b, c); - if (r5 == NULL) - return 16; + eventObjectTemplate = GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + if (eventObjectTemplate == NULL) + { + return EVENT_OBJECTS_COUNT; + } GetEventObjectMovingCameraOffset(&x, &y); - return TrySpawnEventObject(r5, b, c, x, y); + return TrySpawnEventObject(eventObjectTemplate, mapNum, mapGroup, x, y); } void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) @@ -1350,12 +1368,12 @@ void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callba *subspriteTables = gfxInfo->subspriteTables; } -void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 movementType, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +static void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 movementType, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) { MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, sMovementTypeCallbacks[movementType], sprTemplate, subspriteTables); } -void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) { MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObjTemplate->graphicsId, eventObjTemplate->movementType, sprTemplate, subspriteTables); } @@ -1370,7 +1388,7 @@ u8 AddPseudoEventObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x if (spriteTemplate.paletteTag != 0xFFFF) sub_805BDF8(spriteTemplate.paletteTag); spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - if (spriteId != 64 && subspriteTables != NULL) + if (spriteId != MAX_SPRITES && subspriteTables != NULL) { SetSubspriteTables(&gSprites[spriteId], subspriteTables); gSprites[spriteId].subspriteMode = 2; @@ -1380,12 +1398,12 @@ u8 AddPseudoEventObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) { - const struct EventObjectGraphicsInfo *gfxInfo; + const struct EventObjectGraphicsInfo *graphicsInfo; struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; u8 spriteId; - gfxInfo = GetEventObjectGraphicsInfo(graphicsId); + graphicsInfo = GetEventObjectGraphicsInfo(graphicsId); MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, UpdateEventObjectSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables); #ifdef NONMATCHING spriteTemplate.paletteTag = 0xFFFF; @@ -1396,19 +1414,21 @@ u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) y += 7; sub_8060470(&x, &y, 8, 16); spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != 64) + if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = b; sprite->data[1] = elevation; - if (gfxInfo->paletteSlot == 10) - LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot); + if (graphicsInfo->paletteSlot == 10) + { + LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); + } if (subspriteTables != NULL) { SetSubspriteTables(sprite, subspriteTables); @@ -1427,37 +1447,34 @@ void TrySpawnEventObjects(s16 cameraDeltaX, s16 cameraDeltaY) if (gMapHeader.events != NULL) { - s16 r9 = gSaveBlock1.pos.x - 2; - s16 sp8 = gSaveBlock1.pos.x + 17; - s16 r10 = gSaveBlock1.pos.y; - s16 spC = gSaveBlock1.pos.y + 16; + s16 left = gSaveBlock1.pos.x - 2; + s16 right = gSaveBlock1.pos.x + 17; + s16 top = gSaveBlock1.pos.y; + s16 bottom = gSaveBlock1.pos.y + 16; u8 objectCount = gMapHeader.events->eventObjectCount; for (i = 0; i < objectCount; i++) { struct EventObjectTemplate *template = &gSaveBlock1.eventObjectTemplates[i]; - s16 foo = template->x + 7; - s16 bar = template->y + 7; + s16 npcX = template->x + 7; + s16 npcY = template->y + 7; - if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) TrySpawnEventObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, cameraDeltaX, cameraDeltaY); } } } -void RemoveEventObjectIfOutsideView(struct EventObject *eventObject); - void RemoveEventObjectsOutsideView(void) { u8 i; u8 j; + bool8 isActiveLinkPlayer; - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { - bool8 isActiveLinkPlayer; - - for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) + for (j = 0, isActiveLinkPlayer = FALSE; j < 4; j++) { if (gLinkPlayerEventObjects[j].active && i == gLinkPlayerEventObjects[j].eventObjId) isActiveLinkPlayer = TRUE; @@ -1472,18 +1489,18 @@ void RemoveEventObjectsOutsideView(void) } } -void RemoveEventObjectIfOutsideView(struct EventObject *eventObject) +static void RemoveEventObjectIfOutsideView(struct EventObject *eventObject) { - s16 r7 = gSaveBlock1.pos.x - 2; - s16 r5 = gSaveBlock1.pos.x + 17; - s16 r4 = gSaveBlock1.pos.y; - s16 r6 = gSaveBlock1.pos.y + 16; + s16 left = gSaveBlock1.pos.x - 2; + s16 right = gSaveBlock1.pos.x + 17; + s16 top = gSaveBlock1.pos.y; + s16 bottom = gSaveBlock1.pos.y + 16; - if (eventObject->currentCoords.x >= r7 && eventObject->currentCoords.x <= r5 - && eventObject->currentCoords.y >= r4 && eventObject->currentCoords.y <= r6) + if (eventObject->currentCoords.x >= left && eventObject->currentCoords.x <= right + && eventObject->currentCoords.y >= top && eventObject->currentCoords.y <= bottom) return; - if (eventObject->initialCoords.x >= r7 && eventObject->initialCoords.x <= r5 - && eventObject->initialCoords.y >= r4 && eventObject->initialCoords.y <= r6) + if (eventObject->initialCoords.x >= left && eventObject->initialCoords.x <= right + && eventObject->initialCoords.y >= top && eventObject->initialCoords.y <= bottom) return; RemoveEventObject(eventObject); } @@ -1498,7 +1515,7 @@ void sub_805B710(u16 a, u16 b) gUnknown_Debug_03004BC0 = 0; #endif ClearPlayerAvatarInfo(); - for (i = 0; i < 16; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { if (gEventObjects[i].active) { @@ -1511,9 +1528,6 @@ void sub_805B710(u16 a, u16 b) CreateReflectionEffectSprites(); } -extern void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8); -extern void sub_805B914(struct EventObject *); - void sub_805B75C(u8 eventObjectId, s16 b, s16 c) { struct SpriteTemplate sp0; |