diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index f963d45b7..a2bff536f 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -21,10 +21,10 @@ gFieldEffectScriptPointers:: .4byte gFldEffScript_JumpSmallSplash @ FLDEFF_JUMP_SMALL_SPLASH .4byte gFldEffScript_LongGrass @ FLDEFF_LONG_GRASS .4byte gFldEffScript_JumpLongGrass @ FLDEFF_JUMP_LONG_GRASS - .4byte gFldEffScript_Unknown19 @ FLDEFF_UNKNOWN_19 - .4byte gFldEffScript_Unknown20 @ FLDEFF_UNKNOWN_20 - .4byte gFldEffScript_Unknown21 @ FLDEFF_UNKNOWN_21 - .4byte gFldEffScript_Unknown22 @ FLDEFF_UNKNOWN_22 + .4byte gFldEffScript_UnusedGrass @ FLDEFF_UNUSED_GRASS + .4byte gFldEffScript_UnusedGrass2 @ FLDEFF_UNUSED_GRASS_2 + .4byte gFldEffScript_UnusedSand @ FLDEFF_UNUSED_SAND + .4byte gFldEffScript_UnusedWaterSurfacing @ FLDEFF_UNUSED_WATER_SURFACING .4byte gFldEffScript_BerryTreeGrowthSparkle @ FLDEFF_BERRY_TREE_GROWTH_SPARKLE .4byte gFldEffScript_DeepSandFootprints @ FLDEFF_DEEP_SAND_FOOTPRINTS .4byte gFldEffScript_PokecenterHeal @ FLDEFF_POKECENTER_HEAL @@ -148,20 +148,20 @@ gFldEffScript_JumpLongGrass:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpLongGrass end -gFldEffScript_Unknown19:: - loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Unknown19 +gFldEffScript_UnusedGrass:: + loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass end -gFldEffScript_Unknown20:: - loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_Unknown20 +gFldEffScript_UnusedGrass2:: + loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass2 end -gFldEffScript_Unknown21:: - loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Unknown21 +gFldEffScript_UnusedSand:: + loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedSand end -gFldEffScript_Unknown22:: - loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_Unknown22 +gFldEffScript_UnusedWaterSurfacing:: + loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_UnusedWaterSurfacing end gFldEffScript_BerryTreeGrowthSparkle:: diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 4f8da64e0..edf393f98 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -20,10 +20,10 @@ #define FLDEFF_JUMP_SMALL_SPLASH 16 #define FLDEFF_LONG_GRASS 17 #define FLDEFF_JUMP_LONG_GRASS 18 -#define FLDEFF_UNKNOWN_19 19 -#define FLDEFF_UNKNOWN_20 20 -#define FLDEFF_UNKNOWN_21 21 -#define FLDEFF_UNKNOWN_22 22 +#define FLDEFF_UNUSED_GRASS 19 +#define FLDEFF_UNUSED_GRASS_2 20 +#define FLDEFF_UNUSED_SAND 21 +#define FLDEFF_UNUSED_WATER_SURFACING 22 #define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23 #define FLDEFF_DEEP_SAND_FOOTPRINTS 24 #define FLDEFF_POKECENTER_HEAL 25 diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 35c46dd78..814fb38da 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -7,15 +7,15 @@ #include "global.h" -// Exported type declarations - -// Exported RAM declarations - -// Exported ROM declarations +enum { + BOB_NONE, + BOB_PLAYER_AND_MON, + BOB_MON_ONLY, // when player has jumped / flown off +}; u8 CreateWarpArrowSprite(void); -void SetSurfBlob_BobState(u8, u8); -void SetSurfBlob_DontSyncAnim(u8, u8); +void SetSurfBlob_BobState(u8 spriteId, u8 bobState); +void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value); void StartAshFieldEffect(s16, s16, u16, s16); void StartRevealDisguise(struct ObjectEvent *); bool8 UpdateRevealDisguise(struct ObjectEvent *); @@ -24,7 +24,7 @@ u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y); void SetSpriteInvisible(u8 spriteId); -void SetSurfBlob_PlayerOffset(u8 spriteId, u8 hasOffset, s16 offset); +void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); void UpdateJumpImpactEffect(struct Sprite * sprite); void UpdateShadowFieldEffect(struct Sprite * sprite); void UpdateBubblesFieldEffect(struct Sprite * sprite); diff --git a/src/field_effect.c b/src/field_effect.c index e436233f4..6f20a8973 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3055,7 +3055,7 @@ static void UseSurfEffect_5(struct Task * task) gPlayerAvatar.preventStep = FALSE; gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); - SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, 1); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); UnfreezeObjectEvents(); ScriptContext2_Disable(); FieldEffectActiveListRemove(FLDEFF_USE_SURF); @@ -3256,8 +3256,8 @@ static void FlyOutFieldEffect_BirdLeaveBall(struct Task *task) struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { - SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, 2); - SetSurfBlob_DontSyncAnim(objectEvent->fieldEffectSpriteId, 0); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_MON_ONLY); + SetSurfBlob_DontSyncAnim(objectEvent->fieldEffectSpriteId, FALSE); } task->tBirdSpriteId = CreateFlyBirdSprite(); task->tState++; @@ -3538,7 +3538,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, 0); + SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_NONE); ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); CameraObjectReset2(); ObjectEventTurn(playerObj, DIR_WEST); @@ -3630,7 +3630,7 @@ static void FlyInFieldEffect_End(struct Task *task) if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { state = PLAYER_AVATAR_GFX_RIDE; - SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, 1); + SetSurfBlob_BobState(playerObj->fieldEffectSpriteId, BOB_PLAYER_AND_MON); } ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(state)); ObjectEventTurn(playerObj, DIR_SOUTH); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 4fccc6402..789e0a188 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -3,6 +3,7 @@ #include "event_object_movement.h" #include "field_camera.h" #include "field_effect.h" +#include "field_effect_helpers.h" #include "field_weather.h" #include "fieldmap.h" #include "metatile_behavior.h" @@ -800,10 +801,10 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite * sprite) } } -u32 FldEff_Unknown19(void) +u32 FldEff_UnusedGrass(void) { u8 spriteId; - struct Sprite * sprite; + struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); @@ -812,15 +813,15 @@ u32 FldEff_Unknown19(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_19; + sprite->data[0] = FLDEFF_UNUSED_GRASS; } return 0; } -u32 FldEff_Unknown20(void) +u32 FldEff_UnusedGrass2(void) { u8 spriteId; - struct Sprite * sprite; + struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_GRASS_2], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); @@ -829,15 +830,15 @@ u32 FldEff_Unknown20(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_20; + sprite->data[0] = FLDEFF_UNUSED_GRASS_2; } return 0; } -u32 FldEff_Unknown21(void) +u32 FldEff_UnusedSand(void) { u8 spriteId; - struct Sprite * sprite; + struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_UNUSED_SAND], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); @@ -846,15 +847,15 @@ u32 FldEff_Unknown21(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_21; + sprite->data[0] = FLDEFF_UNUSED_SAND; } return 0; } -u32 FldEff_Unknown22(void) +u32 FldEff_UnusedWaterSurfacing(void) { u8 spriteId; - struct Sprite * sprite; + struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_WATER_SURFACING], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); @@ -863,7 +864,7 @@ u32 FldEff_Unknown22(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_22; + sprite->data[0] = FLDEFF_UNUSED_WATER_SURFACING; } return 0; } @@ -939,20 +940,27 @@ static void UpdateAshFieldEffect_Step2(struct Sprite * sprite) FieldEffectStop(sprite, FLDEFF_ASH); } +// Sprite data for surf blob +#define sBitfield data[0] +#define sPlayerOffset data[1] +#define sPlayerObjectId data[2] +#define sBobDirection data[3] +#define sTimer data[4] + u32 FldEff_SurfBlob(void) { u8 spriteId; - struct Sprite * sprite; + struct Sprite *sprite; SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); - if (spriteId !=MAX_SPRITES) + if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.paletteNum = 0; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = 0; + sprite->sPlayerObjectId = gFieldEffectArguments[2]; + sprite->sBobDirection = 0; sprite->data[6] = -1; sprite->data[7] = -1; } @@ -960,51 +968,51 @@ u32 FldEff_SurfBlob(void) return spriteId; } -void SetSurfBlob_BobState(u8 spriteId, u8 value) +void SetSurfBlob_BobState(u8 spriteId, u8 bobState) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF); + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF) | (bobState & 0xF); } -void SetSurfBlob_DontSyncAnim(u8 spriteId, u8 value) +void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 value) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4); + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF0) | ((value & 0xF) << 4); } -void SetSurfBlob_PlayerOffset(u8 spriteId, u8 hasOffset, s16 offset) +void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((hasOffset & 0xF) << 8); - gSprites[spriteId].data[1] = offset; + gSprites[spriteId].sBitfield = (gSprites[spriteId].sBitfield & ~0xF00) | ((hasOffset & 0xF) << 8); + gSprites[spriteId].sPlayerOffset = offset; } -static u8 GetSurfBlob_BobState(struct Sprite * sprite) +static u8 GetSurfBlob_BobState(struct Sprite *sprite) { - return sprite->data[0] & 0xF; + return sprite->sBitfield & 0xF; } -static u8 GetSurfBlob_DontSyncAnim(struct Sprite * sprite) +static bool8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite) { - return (sprite->data[0] & 0xF0) >> 4; + return (sprite->sBitfield & 0xF0) >> 4; } -static u8 GetSurfBlob_HasPlayerOffset(struct Sprite * sprite) +static bool8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite) { - return (sprite->data[0] & 0xF00) >> 8; + return (sprite->sBitfield & 0xF00) >> 8; } -void UpdateSurfBlobFieldEffect(struct Sprite * sprite) +void UpdateSurfBlobFieldEffect(struct Sprite *sprite) { - struct ObjectEvent * objectEvent; - struct Sprite * linkedSprite; + struct ObjectEvent *playerObject; + struct Sprite *playerSprite; - objectEvent = &gObjectEvents[sprite->data[2]]; - linkedSprite = &gSprites[objectEvent->spriteId]; - SynchroniseSurfAnim(objectEvent, sprite); - SynchroniseSurfPosition(objectEvent, sprite); - CreateBobbingEffect(objectEvent, linkedSprite, sprite); - sprite->oam.priority = linkedSprite->oam.priority; + playerObject = &gObjectEvents[sprite->sPlayerObjectId]; + playerSprite = &gSprites[playerObject->spriteId]; + SynchroniseSurfAnim(playerObject, sprite); + SynchroniseSurfPosition(playerObject, sprite); + CreateBobbingEffect(playerObject, playerSprite, sprite); + sprite->oam.priority = playerSprite->oam.priority; } -static void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite * sprite) +static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 surfBlobDirectionAnims[] = { [DIR_NONE] = 0, @@ -1014,62 +1022,70 @@ static void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite [DIR_EAST] = 3 }; - if (GetSurfBlob_DontSyncAnim(sprite) == 0) + if (GetSurfBlob_DontSyncAnim(sprite) == FALSE) StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]); } -void SynchroniseSurfPosition(struct ObjectEvent * objectEvent, struct Sprite * sprite) +void SynchroniseSurfPosition(struct ObjectEvent *playerObject, struct Sprite *surfBlobSprite) { u8 i; - s16 x = objectEvent->currentCoords.x; - s16 y = objectEvent->currentCoords.y; - s32 spriteY = sprite->y2; + s16 x = playerObject->currentCoords.x; + s16 y = playerObject->currentCoords.y; + s32 yOffset = surfBlobSprite->y2; - if (spriteY == 0 && (x != sprite->data[6] || y != sprite->data[7])) + if (yOffset == 0 && (x != surfBlobSprite->data[6] || y != surfBlobSprite->data[7])) { - sprite->data[5] = spriteY; - sprite->data[6] = x; - sprite->data[7] = y; - for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = sprite->data[6], y = sprite->data[7]) + surfBlobSprite->data[5] = yOffset; + surfBlobSprite->data[6] = x; + surfBlobSprite->data[7] = y; + for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = surfBlobSprite->data[6], y = surfBlobSprite->data[7]) { MoveCoords(i, &x, &y); if (MapGridGetZCoordAt(x, y) == 3) { - sprite->data[5]++; + surfBlobSprite->data[5]++; break; } } } } -static void CreateBobbingEffect(struct ObjectEvent * objectEvent, struct Sprite * linkedSprite, struct Sprite * sprite) +static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *playerSprite, struct Sprite *surfBlobSprite) { - u16 unk_83FECFA[] = {7, 15}; - u8 v0 = GetSurfBlob_BobState(sprite); - if (v0 != 0) + u16 intervals[] = {7, 15}; + u8 bobState = GetSurfBlob_BobState(surfBlobSprite); + if (bobState != BOB_NONE) { - if (((u16)(++ sprite->data[4]) & unk_83FECFA[sprite->data[5]]) == 0) + // the surf blob sprite never bobs since sBobDirection will always be 0 + + if (((u16)(++surfBlobSprite->sTimer) & intervals[surfBlobSprite->data[5]]) == 0) + surfBlobSprite->y2 += surfBlobSprite->sBobDirection; + + if ((surfBlobSprite->sTimer & 0x1F) == 0) + surfBlobSprite->sBobDirection = -surfBlobSprite->sBobDirection; + + if (bobState != BOB_MON_ONLY) { - sprite->y2 += sprite->data[3]; - } - if ((sprite->data[4] & 0x1F) == 0) - { - sprite->data[3] = -sprite->data[3]; - } - if (v0 != 2) - { - if (GetSurfBlob_HasPlayerOffset(sprite) == 0) - linkedSprite->y2 = sprite->y2; + if (GetSurfBlob_HasPlayerOffset(surfBlobSprite) == FALSE) + playerSprite->y2 = surfBlobSprite->y2; else - linkedSprite->y2 = sprite->data[1] + sprite->y2; - if (sprite->animCmdIndex != 0) - linkedSprite->y2++; - sprite->x = linkedSprite->x; - sprite->y = linkedSprite->y + 8; + playerSprite->y2 = surfBlobSprite->sPlayerOffset + surfBlobSprite->y2; + + if (surfBlobSprite->animCmdIndex != 0) + playerSprite->y2++; + + surfBlobSprite->x = playerSprite->x; + surfBlobSprite->y = playerSprite->y + 8; } } } +#undef sBitfield +#undef sPlayerOffset +#undef sPlayerObjectId +#undef sBobDirection +#undef sTimer + u8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId) { u8 spriteId; diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index b406a7e21..e9789560d 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1619,7 +1619,7 @@ static void Task_StopSurfingInit(u8 taskId) if (!ObjectEventClearHeldMovementIfFinished(playerObjEvent)) return; } - SetSurfBlob_BobState(playerObjEvent->fieldEffectSpriteId, 2); + SetSurfBlob_BobState(playerObjEvent->fieldEffectSpriteId, BOB_MON_ONLY); QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetJumpSpecialWithEffectMovementAction((u8)gTasks[taskId].data[0])); gTasks[taskId].func = Task_WaitStopSurfing; } diff --git a/src/quest_log_player.c b/src/quest_log_player.c index 2a6615d2e..bb7372c35 100644 --- a/src/quest_log_player.c +++ b/src/quest_log_player.c @@ -151,7 +151,7 @@ static void QL_GfxTransition_StartSurf(void) gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; fieldEffectId = FieldEffectStart(FLDEFF_SURF_BLOB); objectEvent->fieldEffectSpriteId = fieldEffectId; - SetSurfBlob_BobState(fieldEffectId, 1); + SetSurfBlob_BobState(fieldEffectId, BOB_PLAYER_AND_MON); } }