Added alpha-blending shadows.

This commit is contained in:
Ariel Antonitis 2020-06-17 21:08:15 -04:00
parent 85995c8a92
commit 12e3b4efad
4 changed files with 27 additions and 8 deletions

View file

@ -15,6 +15,7 @@ bool8 sub_8155DA0(struct ObjectEvent *);
void sub_8155D78(struct ObjectEvent *); void sub_8155D78(struct ObjectEvent *);
void StartAshFieldEffect(s16, s16, u16, s16); void StartAshFieldEffect(s16, s16, u16, s16);
void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8); void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8);
void SetUpShadow(struct ObjectEvent*, struct Sprite*);
u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*); u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*);
u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);
void UpdateRayquazaSpotlightEffect(struct Sprite*); void UpdateRayquazaSpotlightEffect(struct Sprite*);

View file

@ -8650,6 +8650,10 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S
GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED
}; };
static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) {
SetUpShadow(objEvent, sprite);
}
static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags)
{ {
u8 i; u8 i;
@ -8660,6 +8664,7 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *
for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1)
if (flags & 1) if (flags & 1)
sGroundEffectFuncs[i](objEvent, sprite); sGroundEffectFuncs[i](objEvent, sprite);
GroundEffect_Shadow(objEvent, sprite);
} }
void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags)

View file

@ -34,12 +34,20 @@ static void sub_81556E8(struct ObjectEvent *, struct Sprite *);
static void CreateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *); static void CreateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *);
static void sub_8155850(struct Sprite *); static void sub_8155850(struct Sprite *);
static u32 ShowDisguiseFieldEffect(u8, u8, u8); static u32 ShowDisguiseFieldEffect(u8, u8, u8);
u32 FldEff_Shadow(void);
#define sReflectionObjEventId data[0] #define sReflectionObjEventId data[0]
#define sReflectionObjEventLocalId data[1] #define sReflectionObjEventLocalId data[1]
#define sReflectionVerticalOffset data[2] #define sReflectionVerticalOffset data[2]
#define sIsStillReflection data[7] #define sIsStillReflection data[7]
void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
gFieldEffectArguments[0] = objectEvent->localId;
gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum;
gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup;
FldEff_Shadow();
}
void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection)
{ {
struct Sprite *reflectionSprite; struct Sprite *reflectionSprite;
@ -141,7 +149,7 @@ static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent,
} }
sprite->oam.paletteNum = paletteNum; sprite->oam.paletteNum = paletteNum;
// Apply alpha blending // Apply alpha blending
SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[7] == FALSE ? BLDALPHA_BLEND(8, 12) : BLDALPHA_BLEND(8, 8)); // SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[7] == FALSE ? BLDALPHA_BLEND(8, 12) : BLDALPHA_BLEND(8, 8));
sprite->oam.objMode = 1; // BLEND sprite->oam.objMode = 1; // BLEND
} }
@ -293,12 +301,19 @@ u32 FldEff_Shadow(void)
u8 objectEventId; u8 objectEventId;
const struct ObjectEventGraphicsInfo *graphicsInfo; const struct ObjectEventGraphicsInfo *graphicsInfo;
u8 spriteId; u8 spriteId;
u8 i;
for (i = 0; i < MAX_SPRITES; i++) {
// Return early if a shadow sprite already exists
if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect)
return 0;
}
objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
// SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
gSprites[spriteId].oam.objMode = 1; // BLEND
gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].coordOffsetEnabled = TRUE;
gSprites[spriteId].data[0] = gFieldEffectArguments[0]; gSprites[spriteId].data[0] = gFieldEffectArguments[0];
gSprites[spriteId].data[1] = gFieldEffectArguments[1]; gSprites[spriteId].data[1] = gFieldEffectArguments[1];
@ -325,12 +340,11 @@ void UpdateShadowFieldEffect(struct Sprite *sprite)
sprite->oam.priority = linkedSprite->oam.priority; sprite->oam.priority = linkedSprite->oam.priority;
sprite->pos1.x = linkedSprite->pos1.x; sprite->pos1.x = linkedSprite->pos1.x;
sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3]; sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3];
if (!objectEvent->active || !objectEvent->hasShadow sprite->invisible = linkedSprite->invisible;
if (!objectEvent->active
|| MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior)
|| MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior)
|| MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior))
|| MetatileBehavior_IsReflective(objectEvent->currentMetatileBehavior)
|| MetatileBehavior_IsReflective(objectEvent->previousMetatileBehavior))
{ {
FieldEffectStop(sprite, FLDEFF_SHADOW); FieldEffectStop(sprite, FLDEFF_SHADOW);
} }

View file

@ -155,6 +155,7 @@ void Sunny_InitVars(void)
{ {
gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaTargetIndex = 0;
gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->gammaStepDelay = 20;
Weather_SetBlendCoeffs(8, 12);
} }
void Sunny_InitAll(void) void Sunny_InitAll(void)
@ -2581,5 +2582,3 @@ static void UpdateRainCounter(u8 newWeather, u8 oldWeather)
&& (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM)) && (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM))
IncrementGameStat(GAME_STAT_GOT_RAINED_ON); IncrementGameStat(GAME_STAT_GOT_RAINED_ON);
} }