Merge branch 'master' of https://github.com/pret/pokeemerald into ui-standardize

This commit is contained in:
GriffinR
2023-01-18 11:07:12 -05:00
1149 changed files with 44393 additions and 46317 deletions

View File

@@ -168,7 +168,20 @@ static bool8 AreElevationsCompatible(u8, u8);
static const struct SpriteFrameImage sPicTable_PechaBerryTree[];
const u8 gReflectionEffectPaletteMap[] = {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 sCameraSpriteTemplate = {
.tileTag = 0,
@@ -484,7 +497,12 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = {
{gObjectEventPal_Lugia, OBJ_EVENT_PAL_TAG_LUGIA},
{gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN},
{gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY},
{},
#ifdef BUGFIX
{NULL, OBJ_EVENT_PAL_TAG_NONE},
#else
{}, // BUG: FindObjectEventPaletteIndexByTag looks for OBJ_EVENT_PAL_TAG_NONE and not 0x0.
// If it's looking for a tag that isn't in this table, the game locks in an infinite loop.
#endif
};
static const u16 sReflectionPaletteTags_Brendan[] = {
@@ -610,55 +628,55 @@ static const struct PairedPalettes sSpecialObjectReflectionPaletteSets[] = {
};
static const u16 sObjectPaletteTags0[] = {
OBJ_EVENT_PAL_TAG_BRENDAN,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_1,
OBJ_EVENT_PAL_TAG_NPC_2,
OBJ_EVENT_PAL_TAG_NPC_3,
OBJ_EVENT_PAL_TAG_NPC_4,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
[PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN,
[PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
[PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1,
[PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2,
[PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3,
[PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4,
[PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
[PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
[PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
[PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
};
static const u16 sObjectPaletteTags1[] = {
OBJ_EVENT_PAL_TAG_BRENDAN,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_1,
OBJ_EVENT_PAL_TAG_NPC_2,
OBJ_EVENT_PAL_TAG_NPC_3,
OBJ_EVENT_PAL_TAG_NPC_4,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
[PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN,
[PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
[PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1,
[PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2,
[PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3,
[PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4,
[PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
[PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
[PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
[PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
};
static const u16 sObjectPaletteTags2[] = {
OBJ_EVENT_PAL_TAG_BRENDAN,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_1,
OBJ_EVENT_PAL_TAG_NPC_2,
OBJ_EVENT_PAL_TAG_NPC_3,
OBJ_EVENT_PAL_TAG_NPC_4,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
[PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN,
[PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
[PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1,
[PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2,
[PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3,
[PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4,
[PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
[PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
[PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
[PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
};
static const u16 sObjectPaletteTags3[] = {
OBJ_EVENT_PAL_TAG_BRENDAN,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_1,
OBJ_EVENT_PAL_TAG_NPC_2,
OBJ_EVENT_PAL_TAG_NPC_3,
OBJ_EVENT_PAL_TAG_NPC_4,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
[PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN,
[PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION,
[PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1,
[PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2,
[PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3,
[PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4,
[PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION,
[PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION,
[PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION,
[PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION,
};
static const u16 *const sObjectPaletteTagSets[] = {
@@ -1396,13 +1414,13 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
objectEvent = &gObjectEvents[objectEventId];
graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
if (paletteSlot == PALSLOT_PLAYER)
{
LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, 0);
LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot);
}
else if (paletteSlot == 10)
else if (paletteSlot == PALSLOT_NPC_SPECIAL)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, 10);
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot);
}
else if (paletteSlot >= 16)
{
@@ -1537,13 +1555,13 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *),
struct Sprite *sprite;
u8 spriteId;
spriteTemplate = malloc(sizeof(struct SpriteTemplate));
spriteTemplate = Alloc(sizeof(struct SpriteTemplate));
CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables);
if (spriteTemplate->paletteTag != TAG_NONE)
LoadObjectEventPalette(spriteTemplate->paletteTag);
spriteId = CreateSprite(spriteTemplate, x, y, subpriority);
free(spriteTemplate);
Free(spriteTemplate);
if (spriteId != MAX_SPRITES && subspriteTables != NULL)
{
@@ -1590,7 +1608,7 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio
sprite->coordOffsetEnabled = TRUE;
sprite->sVirtualObjId = virtualObjId;
sprite->sVirtualObjElev = elevation;
if (graphicsInfo->paletteSlot == 10)
if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL)
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
else if (graphicsInfo->paletteSlot >= 16)
_PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot | 0xf0);
@@ -1716,11 +1734,11 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
*(u16 *)&spriteTemplate.paletteTag = TAG_NONE;
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
if (paletteSlot == PALSLOT_PLAYER)
{
LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot == 10)
else if (paletteSlot == PALSLOT_NPC_SPECIAL)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
@@ -1791,11 +1809,11 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);
sprite = &gSprites[objectEvent->spriteId];
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
if (paletteSlot == PALSLOT_PLAYER)
{
PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot == 10)
else if (paletteSlot == PALSLOT_NPC_SPECIAL)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
@@ -1973,14 +1991,19 @@ void SetObjectEventSpritePosByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup,
void FreeAndReserveObjectSpritePalettes(void)
{
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 12;
gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT;
}
static void LoadObjectEventPalette(u16 paletteTag)
{
u16 i = FindObjectEventPaletteIndexByTag(paletteTag);
if (i != OBJ_EVENT_PAL_TAG_NONE) // always true
// FindObjectEventPaletteIndexByTag returns 0xFF on failure, not OBJ_EVENT_PAL_TAG_NONE.
#ifdef BUGFIX
if (i != 0xFF)
#else
if (i != OBJ_EVENT_PAL_TAG_NONE)
#endif
LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]);
}
@@ -2003,6 +2026,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette
void PatchObjectPalette(u16 paletteTag, u8 paletteSlot)
{
// paletteTag is assumed to exist in sObjectEventSpritePalettes
u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag);
LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP);
@@ -2499,19 +2523,19 @@ void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup
}
}
void InitObjectEventPalettes(u8 palSlot)
void InitObjectEventPalettes(u8 reflectionType)
{
FreeAndReserveObjectSpritePalettes();
sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE;
sCurrentReflectionType = palSlot;
if (palSlot == 1)
sCurrentReflectionType = reflectionType;
if (reflectionType == 1)
{
PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], 0, 6);
PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4 + 1);
gReservedSpritePaletteCount = 8;
}
else
{
PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], 0, 10);
PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4_REFLECTION + 1);
}
}
@@ -2519,7 +2543,7 @@ u16 GetObjectPaletteTag(u8 palSlot)
{
u8 i;
if (palSlot < 10)
if (palSlot < PALSLOT_NPC_SPECIAL)
return sObjectPaletteTagSets[sCurrentReflectionType][palSlot];
for (i = 0; sSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)
@@ -2623,7 +2647,7 @@ bool8 ObjectEventIsTrainerAndCloseToPlayer(struct ObjectEvent *objectEvent)
minY = objY - objectEvent->trainerRange_berryTreeId;
maxX = objX + objectEvent->trainerRange_berryTreeId;
maxY = objY + objectEvent->trainerRange_berryTreeId;
if (minX > playerX || maxX < playerX
if (minX > playerX || maxX < playerX
|| minY > playerY || maxY < playerY)
return FALSE;
@@ -8746,13 +8770,13 @@ static void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *
FieldEffectStart(FLDEFF_RIPPLE);
}
u8 (*const gMovementActionFuncs_StoreAndLockAnim[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_StoreAndLockAnim_Step0,
u8 (*const gMovementActionFuncs_LockAnim[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_LockAnim_Step0,
MovementAction_Finish,
};
u8 (*const gMovementActionFuncs_FreeAndUnlockAnim[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_FreeAndUnlockAnim_Step0,
u8 (*const gMovementActionFuncs_UnlockAnim[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_UnlockAnim_Step0,
MovementAction_Finish,
};
@@ -8768,36 +8792,36 @@ u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *
MovementAction_Fly_Finish,
};
u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
u8 MovementAction_LockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
bool32 ableToStore = FALSE;
if (sLockedAnimObjectEvents == NULL)
{
sLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents));
sLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId;
sLockedAnimObjectEvents->localIds[0] = objectEvent->localId;
sLockedAnimObjectEvents->count = 1;
ableToStore = TRUE;
}
else
{
u8 i;
u8 firstFreeSlot;
bool32 found;
for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
u8 firstFreeSlot = OBJECT_EVENTS_COUNT;
bool32 found = FALSE;
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
if (firstFreeSlot == 16 && sLockedAnimObjectEvents->objectEventIds[i] == 0)
if (firstFreeSlot == OBJECT_EVENTS_COUNT && sLockedAnimObjectEvents->localIds[i] == 0)
firstFreeSlot = i;
if (sLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId)
if (sLockedAnimObjectEvents->localIds[i] == objectEvent->localId)
{
found = TRUE;
break;
}
}
if (!found && firstFreeSlot != 16)
if (!found && firstFreeSlot != OBJECT_EVENTS_COUNT)
{
sLockedAnimObjectEvents->objectEventIds[firstFreeSlot] = objectEvent->localId;
sLockedAnimObjectEvents->localIds[firstFreeSlot] = objectEvent->localId;
sLockedAnimObjectEvents->count++;
ableToStore = TRUE;
}
@@ -8813,7 +8837,7 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct
return TRUE;
}
u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
u8 MovementAction_UnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
bool32 ableToStore;
u8 index;
@@ -8823,9 +8847,9 @@ u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *objectEvent, struc
{
ableToStore = FALSE;
index = FindLockedObjectEventIndex(objectEvent);
if (index != 16)
if (index != OBJECT_EVENTS_COUNT)
{
sLockedAnimObjectEvents->objectEventIds[index] = 0;
sLockedAnimObjectEvents->localIds[index] = 0;
sLockedAnimObjectEvents->count--;
ableToStore = TRUE;
}
@@ -8848,7 +8872,7 @@ u8 FindLockedObjectEventIndex(struct ObjectEvent *objectEvent)
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
if (sLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId)
if (sLockedAnimObjectEvents->localIds[i] == objectEvent->localId)
return i;
}
return OBJECT_EVENTS_COUNT;