Merge pull request #523 from cbt6/field-effect-helpers

Document src/field_effect_helpers.c
This commit is contained in:
GriffinR
2022-07-26 11:06:45 -05:00
committed by GitHub
7 changed files with 117 additions and 101 deletions
+12 -12
View File
@@ -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::
+4 -4
View File
@@ -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
+8 -8
View File
@@ -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);
+5 -5
View File
@@ -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);
+86 -70
View File
@@ -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;
+1 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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);
}
}