summaryrefslogtreecommitdiff
path: root/src/event_object_movement.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event_object_movement.c')
-rw-r--r--src/event_object_movement.c208
1 files changed, 113 insertions, 95 deletions
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 01460539c..5d498c1ff 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -60,8 +60,9 @@ static bool8 EventObjectZCoordIsCompatible(struct EventObject*, u8);
static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8, struct EventObjectTemplate*, u8);
static void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *);
static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z);
+static void CreateReflectionEffectSprites(void);
-const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
+const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
const struct SpriteTemplate gCameraSpriteTemplate = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject};
@@ -324,7 +325,7 @@ const u8 gInitialMovementTypeFacingDirections[] = {
#include "data/field_event_obj/event_object_subsprites.h"
#include "data/field_event_obj/event_object_graphics_info.h"
-const struct SpritePalette gUnknown_0837377C[] = {
+const struct SpritePalette sEventObjectSpritePalettes[] = {
{gEventObjectPalette0, 0x1103},
{gEventObjectPalette1, 0x1104},
{gEventObjectPalette2, 0x1105},
@@ -355,121 +356,122 @@ const struct SpritePalette gUnknown_0837377C[] = {
{NULL, 0x0000}
};
-const u16 Palettes_837385C[] = {
+const u16 gPlayerReflectionPaletteTags[] = {
0x1101,
0x1101,
0x1101,
0x1101
};
-const u16 Palettes_8373864[] = {
+// These were probably intended to be used for the female player's reflection.
+const u16 gUnusedPlayerReflectionPaletteTags[] = {
0x1111,
0x1111,
0x1111,
0x1111
};
-const u16 Palettes_837386C[] = {
+const u16 gPlayerUnderwaterReflectionPaletteTags[] = {
0x1115,
0x1115,
0x1115,
0x1115
};
-const struct PairedPalettes gUnknown_08373874[] = {
- {0x1100, Palettes_837385C},
- {0x1110, Palettes_837385C},
- {0x1115, Palettes_837386C},
+const struct ReflectionPaletteSet gPlayerReflectionPaletteSets[] = {
+ {0x1100, gPlayerReflectionPaletteTags},
+ {0x1110, gPlayerReflectionPaletteTags},
+ {0x1115, gPlayerUnderwaterReflectionPaletteTags},
{0x11FF, NULL}
};
-const u16 Palettes_8373894[] = {
+const u16 gQuintyPlumpReflectionPaletteTags[] = {
0x110C,
0x110C,
0x110C,
0x110C
};
-const u16 Palettes_837389C[] = {
+const u16 gTruckReflectionPaletteTags[] = {
0x110D,
0x110D,
0x110D,
0x110D
};
-const u16 Palettes_83738A4[] = {
+const u16 gMachokeMoverReflectionPaletteTags[] = {
0x110E,
0x110E,
0x110E,
0x110E
};
-const u16 Palettes_83738AC[] = {
+const u16 gMovingBoxReflectionPaletteTags[] = {
0x1112,
0x1112,
0x1112,
0x1112
};
-const u16 Palettes_83738B4[] = {
+const u16 gCableCarReflectionPaletteTags[] = {
0x1113,
0x1113,
0x1113,
0x1113
};
-const u16 Palettes_83738BC[] = {
+const u16 gSSTidalReflectionPaletteTags[] = {
0x1114,
0x1114,
0x1114,
0x1114
};
-const u16 Palettes_83738C4[] = {
+const u16 gSubmarineShadowReflectionPaletteTags[] = {
0x111A,
0x111A,
0x111A,
0x111A
};
-const u16 Palettes_83738CC[] = {
+const u16 gKyogre2ReflectionPaletteTags[] = {
0x1117,
0x1117,
0x1117,
0x1117
};
-const u16 Palettes_83738D4[] = {
+const u16 gGroudon2ReflectionPaletteTags[] = {
0x1119,
0x1119,
0x1119,
0x1119
};
-const u16 Palettes_83738DC[] = {
+const u16 gInvisibleKecleonReflectionPaletteTags[] = {
0x1109,
0x1109,
0x1109,
0x1109
};
-const struct PairedPalettes gUnknown_083738E4[] = {
- {0x1100, Palettes_837385C},
- {0x1110, Palettes_837385C},
- {0x110B, Palettes_8373894},
- {0x110D, Palettes_837389C},
- {0x110E, Palettes_83738A4},
- {0x1112, Palettes_83738AC},
- {0x1113, Palettes_83738B4},
- {0x1114, Palettes_83738BC},
- {0x1116, Palettes_83738CC},
- {0x1118, Palettes_83738D4},
- {0x1105, Palettes_83738DC},
- {0x111A, Palettes_83738C4},
+const struct ReflectionPaletteSet gSpecialObjectReflectionPaletteSets[] = {
+ {0x1100, gPlayerReflectionPaletteTags},
+ {0x1110, gPlayerReflectionPaletteTags},
+ {0x110B, gQuintyPlumpReflectionPaletteTags},
+ {0x110D, gTruckReflectionPaletteTags},
+ {0x110E, gMachokeMoverReflectionPaletteTags},
+ {0x1112, gMovingBoxReflectionPaletteTags},
+ {0x1113, gCableCarReflectionPaletteTags},
+ {0x1114, gSSTidalReflectionPaletteTags},
+ {0x1116, gKyogre2ReflectionPaletteTags},
+ {0x1118, gGroudon2ReflectionPaletteTags},
+ {0x1105, gInvisibleKecleonReflectionPaletteTags},
+ {0x111A, gSubmarineShadowReflectionPaletteTags},
{0x11FF, NULL}
};
-const u16 Unknown_837394C[] = {
+const u16 gObjectPaletteTags0[] = {
0x1100,
0x1101,
0x1103,
@@ -482,7 +484,7 @@ const u16 Unknown_837394C[] = {
0x110A
};
-const u16 Unknown_8373960[] = {
+const u16 gObjectPaletteTags1[] = {
0x1100,
0x1101,
0x1103,
@@ -495,7 +497,7 @@ const u16 Unknown_8373960[] = {
0x110A
};
-const u16 Unknown_8373974[] = {
+const u16 gObjectPaletteTags2[] = {
0x1100,
0x1101,
0x1103,
@@ -508,7 +510,7 @@ const u16 Unknown_8373974[] = {
0x110A
};
-const u16 Unknown_8373988[] = {
+const u16 gObjectPaletteTags3[] = {
0x1100,
0x1101,
0x1103,
@@ -521,11 +523,11 @@ const u16 Unknown_8373988[] = {
0x110A
};
-const u16 *const gUnknown_0837399C[] = {
- Unknown_837394C,
- Unknown_8373960,
- Unknown_8373974,
- Unknown_8373988
+const u16 *const gObjectPaletteTagSets[] = {
+ gObjectPaletteTags0,
+ gObjectPaletteTags1,
+ gObjectPaletteTags2,
+ gObjectPaletteTags3
};
#include "data/field_event_obj/berry_tree_graphics_tables.h"
@@ -958,8 +960,11 @@ const u8 gUnknown_08375767[][4] = {
#include "data/field_event_obj/movement_action_func_tables.h"
-static u8 gUnknown_030005A4;
-static u16 gUnknown_030005A6;
+// There is code supporing multiple sets of player reflection palettes, but
+// the data for each is identical. Perhaps non-water/ice reflections were planned.
+static u8 sCurrentReflectionType;
+
+static u16 sCurrentSpecialObjectPaletteTag;
extern struct LinkPlayerEventObject gLinkPlayerEventObjects[];
extern u8 gReservedSpritePaletteCount;
@@ -989,16 +994,21 @@ static void ClearAllEventObjects(void)
#endif
}
-void sub_805AA98(void)
+void ResetEventObjects(void)
{
ClearLinkPlayerEventObjects();
ClearAllEventObjects();
ClearPlayerAvatarInfo();
- sub_805AAB0();
+ CreateReflectionEffectSprites();
}
-void sub_805AAB0(void)
+static void CreateReflectionEffectSprites(void)
{
+ // The reflection effect when an event object is standing over water or ice
+ // is driven by these two invisible sprites' callback functions. The callback
+ // continuously updates OAM rot/scale matrices using affine animations that scale
+ // the sprite up and down horizontally. The second one is needed to handle the inverted
+ // effect when the object is facing to the east. (The sprite has h-flip enabled).
u8 spriteId = spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F);
gSprites[spriteId].oam.affineMode = 1;
InitSpriteAffineAnim(&gSprites[spriteId]);
@@ -1223,9 +1233,9 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjTemplate
eventObject = &gEventObjects[eventObjectId];
gfxInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
if (gfxInfo->paletteSlot == 0)
- npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadPlayerObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
else if (gfxInfo->paletteSlot == 10)
- npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
if (eventObject->movementType == MOVEMENT_TYPE_INVISIBLE)
eventObject->invisible = TRUE;
@@ -1330,7 +1340,7 @@ void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callba
const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(graphicsId);
sprTemplate->tileTag = gfxInfo->tileTag;
- sprTemplate->paletteTag = gfxInfo->paletteTag1;
+ sprTemplate->paletteTag = gfxInfo->paletteTag;
sprTemplate->oam = gfxInfo->oam;
sprTemplate->anims = gfxInfo->anims;
sprTemplate->images = gfxInfo->images;
@@ -1397,7 +1407,7 @@ u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction)
sprite->data[0] = b;
sprite->data[1] = elevation;
if (gfxInfo->paletteSlot == 10)
- npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
if (subspriteTables != NULL)
{
SetSubspriteTables(sprite, subspriteTables);
@@ -1497,7 +1507,7 @@ void sub_805B710(u16 a, u16 b)
#endif
}
}
- sub_805AAB0();
+ CreateReflectionEffectSprites();
}
extern void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8);
@@ -1529,9 +1539,9 @@ void sub_805B75C(u8 eventObjectId, s16 b, s16 c)
sp0.images = &sp18;
*(u16 *)&sp0.paletteTag = 0xFFFF;
if (gfxInfo->paletteSlot == 0)
- npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadPlayerObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
if (gfxInfo->paletteSlot > 9)
- npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
*(u16 *)&sp0.paletteTag = 0xFFFF;
spriteId = CreateSprite(&sp0, 0, 0, 0);
if (spriteId != 64)
@@ -1547,7 +1557,7 @@ void sub_805B75C(u8 eventObjectId, s16 b, s16 c)
if (eventObject->movementType == MOVEMENT_TYPE_PLAYER)
{
SetPlayerAvatarEventObjectIdAndObjectId(eventObjectId, spriteId);
- eventObject->warpArrowSpriteId = sub_8126B54();
+ eventObject->warpArrowSpriteId = CreateWarpArrowSprite();
}
if (subspriteTables != NULL)
SetSubspriteTables(sprite, subspriteTables);
@@ -1591,9 +1601,9 @@ void sub_805B980(struct EventObject *eventObject, u8 graphicsId)
gfxInfo = GetEventObjectGraphicsInfo(graphicsId);
sprite = &gSprites[eventObject->spriteId];
if (gfxInfo->paletteSlot == 0)
- pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ PatchObjectPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
if (gfxInfo->paletteSlot == 10)
- npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ LoadSpecialObjectReflectionPalette(gfxInfo->paletteTag, gfxInfo->paletteSlot);
sprite->oam.shape = gfxInfo->oam->shape;
sprite->oam.size = gfxInfo->oam->size;
sprite->images = gfxInfo->images;
@@ -1749,7 +1759,7 @@ void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
}
}
-void gpu_pal_allocator_reset__manage_upper_four(void)
+void FreeAndReserveObjectSpritePalettes(void)
{
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 12;
@@ -1760,7 +1770,7 @@ void sub_805BDF8(u16 tag)
u16 paletteIndex = FindEventObjectPaletteIndexByTag(tag);
if (paletteIndex != 0x11FF) //always happens. FindEventObjectPaletteIndexByTag returns u8
- sub_805BE58(&gUnknown_0837377C[paletteIndex]);
+ sub_805BE58(&sEventObjectSpritePalettes[paletteIndex]);
}
void unref_sub_805BE24(u16 *arr)
@@ -1779,58 +1789,58 @@ u8 sub_805BE58(const struct SpritePalette *palette)
return LoadSpritePalette(palette);
}
-void pal_patch_for_npc(u16 paletteTag, u16 paletteIndex)
+void PatchObjectPalette(u16 paletteTag, u16 paletteIndex)
{
u8 index = paletteIndex;
u8 tagPaletteIndex = FindEventObjectPaletteIndexByTag(paletteTag);
- LoadPalette(gUnknown_0837377C[tagPaletteIndex].data, index * 16 + 0x100, 0x20);
+ LoadPalette(sEventObjectSpritePalettes[tagPaletteIndex].data, index * 16 + 0x100, 0x20);
}
-void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c)
+static void PatchObjectPalettes(const u16 *paletteTags, u8 paletteIndex, u8 maxPaletteIndex)
{
- for (; b < c; arr++, b++)
- pal_patch_for_npc(*arr, b);
+ for (; paletteIndex < maxPaletteIndex; paletteTags++, paletteIndex++)
+ PatchObjectPalette(*paletteTags, paletteIndex);
}
u8 FindEventObjectPaletteIndexByTag(u16 tag)
{
u8 i;
- for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++)
+ for (i = 0; sEventObjectSpritePalettes[i].tag != 0x11FF; i++)
{
- if (gUnknown_0837377C[i].tag == tag)
+ if (sEventObjectSpritePalettes[i].tag == tag)
return i;
}
return 0xFF;
}
-void npc_load_two_palettes__no_record(u16 paletteTag, u8 paletteIndex)
+void LoadPlayerObjectReflectionPalette(u16 paletteTag, u8 paletteIndex)
{
u8 i;
- pal_patch_for_npc(paletteTag, paletteIndex);
- for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++)
+ PatchObjectPalette(paletteTag, paletteIndex);
+ for (i = 0; gPlayerReflectionPaletteSets[i].mainPaletteTag != 0x11FF; i++)
{
- if (gUnknown_08373874[i].tag == paletteTag)
+ if (gPlayerReflectionPaletteSets[i].mainPaletteTag == paletteTag)
{
- pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[paletteIndex]);
+ PatchObjectPalette(gPlayerReflectionPaletteSets[i].reflectionPaletteTags[sCurrentReflectionType], gReflectionEffectPaletteMap[paletteIndex]);
break;
}
}
}
-void npc_load_two_palettes__and_record(u16 paletteTag, u8 paletteIndex)
+void LoadSpecialObjectReflectionPalette(u16 paletteTag, u8 paletteIndex)
{
u8 i;
- gUnknown_030005A6 = paletteTag;
- pal_patch_for_npc(paletteTag, paletteIndex);
- for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++)
+ sCurrentSpecialObjectPaletteTag = paletteTag;
+ PatchObjectPalette(paletteTag, paletteIndex);
+ for (i = 0; gSpecialObjectReflectionPaletteSets[i].mainPaletteTag != 0x11FF; i++)
{
- if (gUnknown_083738E4[i].tag == paletteTag)
+ if (gSpecialObjectReflectionPaletteSets[i].mainPaletteTag == paletteTag)
{
- pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[paletteIndex]);
+ PatchObjectPalette(gSpecialObjectReflectionPaletteSets[i].reflectionPaletteTags[sCurrentReflectionType], gReflectionEffectPaletteMap[paletteIndex]);
break;
}
}
@@ -2046,7 +2056,7 @@ u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority)
{
u8 i;
- for (i = 0; i < 64; i++)
+ for (i = 0; i < MAX_SPRITES; i++)
{
if (!gSprites[i].inUse)
{
@@ -2060,11 +2070,11 @@ u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority)
return i;
}
-u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority)
+u8 CreateCopySpriteAt(struct Sprite *src, s16 x, s16 y, u8 subpriority)
{
s16 i;
- for (i = 63; i > -1; i--)
+ for (i = MAX_SPRITES - 1; i > -1; i--)
{
if (!gSprites[i].inUse)
{
@@ -2075,7 +2085,8 @@ u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority)
return i;
}
}
- return 64;
+
+ return MAX_SPRITES;
}
void SetEventObjectDirection(struct EventObject *eventObject, u8 direction)
@@ -2210,28 +2221,31 @@ void TryOverrideTemplateCoordsForEventObject(u8 localId, u8 mapNum, u8 mapGroup)
OverrideTemplateCoordsForEventObject(&gEventObjects[eventObjectId]);
}
-void sub_805C7C4(u8 a)
+void InitEventObjectPalettes(u8 reflectionType)
{
- gpu_pal_allocator_reset__manage_upper_four();
- gUnknown_030005A6 = 0x11FF;
- gUnknown_030005A4 = a;
- pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10);
+ FreeAndReserveObjectSpritePalettes();
+ sCurrentSpecialObjectPaletteTag = 0x11FF;
+ sCurrentReflectionType = reflectionType;
+ PatchObjectPalettes(gObjectPaletteTagSets[sCurrentReflectionType], 0, 10);
}
-u16 npc_paltag_by_palslot(u8 a)
+u16 GetObjectPaletteTag(u8 paletteIndex)
{
u8 i;
- if (a < 10)
- return gUnknown_0837399C[gUnknown_030005A4][a];
+ // Regular objects and the player occupy the first 10 palettes.
+ if (paletteIndex < 10)
+ return gObjectPaletteTagSets[sCurrentReflectionType][paletteIndex];
- for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++)
+ // Palette slots 10 and 11 belong to the special object.
+ for (i = 0; gSpecialObjectReflectionPaletteSets[i].mainPaletteTag != 0x11FF; i++)
{
- if (gUnknown_083738E4[i].tag == gUnknown_030005A6)
+ if (gSpecialObjectReflectionPaletteSets[i].mainPaletteTag == sCurrentSpecialObjectPaletteTag)
{
- return gUnknown_083738E4[i].data[gUnknown_030005A4];
+ return gSpecialObjectReflectionPaletteSets[i].reflectionPaletteTags[sCurrentReflectionType];
}
}
+
return 0x11FF;
}
@@ -7554,12 +7568,12 @@ void GroundEffect_MoveOnLongGrass(struct EventObject *eventObj, struct Sprite *s
void GroundEffect_WaterReflection(struct EventObject *eventObj, struct Sprite *sprite)
{
- SetUpReflection(eventObj, sprite, 0);
+ InitObjectReflectionSprite(eventObj, sprite, 0);
}
void GroundEffect_IceReflection(struct EventObject *eventObj, struct Sprite *sprite)
{
- SetUpReflection(eventObj, sprite, 1);
+ InitObjectReflectionSprite(eventObj, sprite, 1);
}
void GroundEffect_FlowingWater(struct EventObject *eventObj, struct Sprite *sprite)
@@ -7655,8 +7669,12 @@ void GroundEffect_JumpOnTallGrass(struct EventObject *eventObj, struct Sprite *s
gFieldEffectArguments[3] = 2;
FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);
- spriteId = sub_8126FF0(
- eventObj->localId, eventObj->mapNum, eventObj->mapGroup, eventObj->currentCoords.x, eventObj->currentCoords.y);
+ spriteId = FindTallGrassFieldEffectSpriteId(
+ eventObj->localId,
+ eventObj->mapNum,
+ eventObj->mapGroup,
+ eventObj->currentCoords.x,
+ eventObj->currentCoords.y);
if (spriteId == MAX_SPRITES)
GroundEffect_SpawnOnTallGrass(eventObj, sprite);