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