New Feature: ORAS Dowsing (#7211)
This commit is contained in:
parent
a32da780c4
commit
6ddabde582
@ -2313,6 +2313,11 @@
|
|||||||
callnative ScriptSetDoubleBattleFlag, requests_effects=1
|
callnative ScriptSetDoubleBattleFlag, requests_effects=1
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ Stop using the ORAS dowsing machine.
|
||||||
|
.macro stoporasdowsing
|
||||||
|
callnative EndORASDowsing
|
||||||
|
.endm
|
||||||
|
|
||||||
@ ============================ @
|
@ ============================ @
|
||||||
@ FAKE RTC MACROS
|
@ FAKE RTC MACROS
|
||||||
@ Will only function if OW_USE_FAKE_RTC is true. If it has any additional requirements, it will be listed accordingly.
|
@ Will only function if OW_USE_FAKE_RTC is true. If it has any additional requirements, it will be listed accordingly.
|
||||||
|
|||||||
@ -83,6 +83,7 @@ gFieldEffectScriptPointers::
|
|||||||
.4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG
|
.4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG
|
||||||
.4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB
|
.4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB
|
||||||
.4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST
|
.4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST
|
||||||
|
.4byte gFieldEffectScript_ORASDowse @ FLDEFF_ORAS_DOWSE
|
||||||
|
|
||||||
gFieldEffectScript_ExclamationMarkIcon1::
|
gFieldEffectScript_ExclamationMarkIcon1::
|
||||||
field_eff_callnative FldEff_ExclamationMarkIcon
|
field_eff_callnative FldEff_ExclamationMarkIcon
|
||||||
@ -386,6 +387,7 @@ gFieldEffectScript_CaveDust::
|
|||||||
gFieldEffectScript_Defog::
|
gFieldEffectScript_Defog::
|
||||||
field_eff_callnative FldEff_Defog
|
field_eff_callnative FldEff_Defog
|
||||||
field_eff_end
|
field_eff_end
|
||||||
|
|
||||||
gFieldEffectScript_UseRockClimb:: @ 82DBC3F
|
gFieldEffectScript_UseRockClimb:: @ 82DBC3F
|
||||||
field_eff_callnative FldEff_UseRockClimb
|
field_eff_callnative FldEff_UseRockClimb
|
||||||
field_eff_end
|
field_eff_end
|
||||||
@ -394,3 +396,7 @@ gFieldEffectScript_RockClimbDust:: @ 82DBB28
|
|||||||
field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust
|
field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust
|
||||||
field_eff_end
|
field_eff_end
|
||||||
|
|
||||||
|
gFieldEffectScript_ORASDowse::
|
||||||
|
field_eff_callnative FldEff_ORASDowsing
|
||||||
|
field_eff_end
|
||||||
|
|
||||||
|
|||||||
@ -205,6 +205,7 @@ EventScript_FoundHiddenItem::
|
|||||||
end
|
end
|
||||||
|
|
||||||
EventScript_PutHiddenItemInPocket::
|
EventScript_PutHiddenItemInPocket::
|
||||||
|
callnative Script_ClearDowsingColor
|
||||||
delay 10
|
delay 10
|
||||||
showitemdescription
|
showitemdescription
|
||||||
waitmessage
|
waitmessage
|
||||||
@ -215,6 +216,7 @@ EventScript_PutHiddenItemInPocket::
|
|||||||
hideitemdescription
|
hideitemdescription
|
||||||
special TryPutTreasureInvestigatorsOnAir
|
special TryPutTreasureInvestigatorsOnAir
|
||||||
special SetHiddenItemFlag
|
special SetHiddenItemFlag
|
||||||
|
callnative Script_UpdateDowseState
|
||||||
releaseall
|
releaseall
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
19
graphics/field_effects/palettes/oras_dowsing.pal
Normal file
19
graphics/field_effects/palettes/oras_dowsing.pal
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
JASC-PAL
|
||||||
|
0100
|
||||||
|
16
|
||||||
|
115 197 164
|
||||||
|
0 0 0
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 255 255
|
||||||
|
255 0 255
|
||||||
BIN
graphics/field_effects/pics/oras_dowsing_brendan.png
Normal file
BIN
graphics/field_effects/pics/oras_dowsing_brendan.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 313 B |
BIN
graphics/field_effects/pics/oras_dowsing_may.png
Normal file
BIN
graphics/field_effects/pics/oras_dowsing_may.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 345 B |
@ -38,4 +38,15 @@
|
|||||||
// Vs. Seeker
|
// Vs. Seeker
|
||||||
#define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working.
|
#define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working.
|
||||||
|
|
||||||
|
// ORAS Dowsing Machine
|
||||||
|
#define I_ORAS_DOWSING_FLAG 0 // Replace 0 with an unused flag to enable the Dowsing Machine mechanic from ORAS.
|
||||||
|
#define I_ORAS_DOWSING_SOUNDS TRUE // If TRUE, the Dowsing Machine will make sounds based on how far away the hidden item is.
|
||||||
|
#define I_ORAS_DOWSING_COLOR_PAL 15 // The color within the palette that will change based on proximity to the item.
|
||||||
|
// Color values for the ORAS dowsing distances/anims
|
||||||
|
#define I_ORAS_DOWSING_COLOR_NONE RGB_GRAY
|
||||||
|
#define I_ORAS_DOWSING_COLOR_SLOW RGB2GBA(56, 120, 255)
|
||||||
|
#define I_ORAS_DOWSING_COLOR_NORMAL RGB2GBA(24, 216, 24)
|
||||||
|
#define I_ORAS_DOWSING_COLOR_FAST RGB2GBA(255, 255, 40)
|
||||||
|
#define I_ORAS_DOWSING_COLOR_FASTER RGB_RED
|
||||||
|
|
||||||
#endif // GUARD_CONFIG_ITEM_H
|
#endif // GUARD_CONFIG_ITEM_H
|
||||||
|
|||||||
@ -79,6 +79,7 @@
|
|||||||
#define FLDEFF_DEFOG 74
|
#define FLDEFF_DEFOG 74
|
||||||
#define FLDEFF_USE_ROCK_CLIMB 75
|
#define FLDEFF_USE_ROCK_CLIMB 75
|
||||||
#define FLDEFF_ROCK_CLIMB_DUST 76
|
#define FLDEFF_ROCK_CLIMB_DUST 76
|
||||||
|
#define FLDEFF_ORAS_DOWSE 77
|
||||||
|
|
||||||
#define FLDEFFOBJ_SHADOW_S 0
|
#define FLDEFFOBJ_SHADOW_S 0
|
||||||
#define FLDEFFOBJ_SHADOW_M 1
|
#define FLDEFFOBJ_SHADOW_M 1
|
||||||
@ -123,6 +124,8 @@
|
|||||||
#define FLDEFFOBJ_CAVE_DUST 40
|
#define FLDEFFOBJ_CAVE_DUST 40
|
||||||
#define FLDEFFOBJ_ROCK_CLIMB_BLOB 41
|
#define FLDEFFOBJ_ROCK_CLIMB_BLOB 41
|
||||||
#define FLDEFFOBJ_ROCK_CLIMB_DUST 42
|
#define FLDEFFOBJ_ROCK_CLIMB_DUST 42
|
||||||
|
#define FLDEFFOBJ_ORAS_DOWSE_BRENDAN 43
|
||||||
|
#define FLDEFFOBJ_ORAS_DOWSE_MAY 44
|
||||||
|
|
||||||
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
|
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
|
||||||
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
|
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
|
||||||
@ -138,6 +141,7 @@
|
|||||||
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
|
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
|
||||||
#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012
|
#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012
|
||||||
#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1013
|
#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1013
|
||||||
|
#define FLDEFF_PAL_TAG_ORAS_DOWSE 0x1014
|
||||||
#define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400
|
#define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400
|
||||||
|
|
||||||
// tile tags, for field effects that may have many copies on screen at once
|
// tile tags, for field effects that may have many copies on screen at once
|
||||||
|
|||||||
@ -49,6 +49,8 @@ void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8 taskId);
|
|||||||
void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField);
|
void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField);
|
||||||
void ItemUseOutOfBattle_PokeFlute(u8 taskId);
|
void ItemUseOutOfBattle_PokeFlute(u8 taskId);
|
||||||
void ItemUseOutOfBattle_TownMap(u8 taskId);
|
void ItemUseOutOfBattle_TownMap(u8 taskId);
|
||||||
|
bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8);
|
||||||
|
u8 GetDirectionToHiddenItem(s16, s16);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
BALL_THROW_UNABLE_TWO_MONS,
|
BALL_THROW_UNABLE_TWO_MONS,
|
||||||
|
|||||||
39
include/oras_dowse.h
Normal file
39
include/oras_dowse.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef GUARD_ORAS_DOWSE_H
|
||||||
|
#define GUARD_ORAS_DOWSE_H
|
||||||
|
|
||||||
|
// States for ORAS Dowsing
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
ORASD_WIGGLE_NONE,
|
||||||
|
ORASD_WIGGLE_SLOW,
|
||||||
|
ORASD_WIGGLE_NORMAL,
|
||||||
|
ORASD_WIGGLE_FAST,
|
||||||
|
ORASD_WIGGLE_FASTER
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_SLOW (ANIM_STD_FACE_EAST + 1)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_SLOW (ANIM_STD_FACE_EAST + 2)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_WEST_SLOW (ANIM_STD_FACE_EAST + 3)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_EAST_SLOW (ANIM_STD_FACE_EAST + 4)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH (ANIM_STD_FACE_EAST + 5)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_NORTH (ANIM_STD_FACE_EAST + 6)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_WEST (ANIM_STD_FACE_EAST + 7)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_EAST (ANIM_STD_FACE_EAST + 8)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FAST (ANIM_STD_FACE_EAST + 9)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_FAST (ANIM_STD_FACE_EAST + 10)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_WEST_FAST (ANIM_STD_FACE_EAST + 11)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_EAST_FAST (ANIM_STD_FACE_EAST + 12)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FASTER (ANIM_STD_FACE_EAST + 13)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_NORTH_FASTER (ANIM_STD_FACE_EAST + 14)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_WEST_FASTER (ANIM_STD_FACE_EAST + 15)
|
||||||
|
#define ANIM_ORAS_DOWSE_WIGGLE_EAST_FASTER (ANIM_STD_FACE_EAST + 16)
|
||||||
|
|
||||||
|
extern const u16 gFieldEffectPal_ORASDowsing[];
|
||||||
|
|
||||||
|
void Task_UseORASDowsingMachine(u8 taskId);
|
||||||
|
void ResumeORASDowseFieldEffect(void);
|
||||||
|
void UpdateDowseState(struct Sprite *sprite);
|
||||||
|
void UpdateDowsingAnimDirection(struct Sprite *sprite, struct ObjectEvent *playerObj);
|
||||||
|
void EndORASDowsing(void);
|
||||||
|
|
||||||
|
#endif // GUARD_ORAS_DOWSE_H
|
||||||
@ -693,6 +693,12 @@ $(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png
|
|||||||
$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||||
|
|
||||||
|
$(FLDEFFGFXDIR)/oras_dowsing_brendan.4bpp: %.4bpp: %.png
|
||||||
|
$(GFX) $< $@ -mwidth 2 -mheight 4
|
||||||
|
|
||||||
|
$(FLDEFFGFXDIR)/oras_dowsing_may.4bpp: %.4bpp: %.png
|
||||||
|
$(GFX) $< $@ -mwidth 2 -mheight 4
|
||||||
|
|
||||||
$(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 2 -mheight 2
|
$(GFX) $< $@ -mwidth 2 -mheight 2
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "fieldmap.h"
|
#include "fieldmap.h"
|
||||||
#include "field_specials.h"
|
#include "field_specials.h"
|
||||||
#include "metatile_behavior.h"
|
#include "metatile_behavior.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "overworld.h"
|
#include "overworld.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "constants/songs.h"
|
#include "constants/songs.h"
|
||||||
@ -1003,6 +1004,7 @@ void GetOnOffBike(u8 transitionFlags)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
SetPlayerAvatarTransitionFlags(transitionFlags);
|
SetPlayerAvatarTransitionFlags(transitionFlags);
|
||||||
Overworld_SetSavedMusic(MUS_CYCLING);
|
Overworld_SetSavedMusic(MUS_CYCLING);
|
||||||
Overworld_ChangeMusicTo(MUS_CYCLING);
|
Overworld_ChangeMusicTo(MUS_CYCLING);
|
||||||
|
|||||||
@ -42,6 +42,8 @@ extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks;
|
|||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust;
|
||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob;
|
||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust;
|
||||||
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingBrendan;
|
||||||
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingMay;
|
||||||
|
|
||||||
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
||||||
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
|
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
|
||||||
@ -87,4 +89,6 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
|||||||
[FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust,
|
[FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust,
|
||||||
[FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob,
|
[FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob,
|
||||||
[FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust,
|
[FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust,
|
||||||
|
[FLDEFFOBJ_ORAS_DOWSE_BRENDAN] = &gFieldEffectObjectTemplate_ORASDowsingBrendan,
|
||||||
|
[FLDEFFOBJ_ORAS_DOWSE_MAY] = &gFieldEffectObjectTemplate_ORASDowsingMay,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include "mirage_tower.h"
|
#include "mirage_tower.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "metatile_behavior.h"
|
#include "metatile_behavior.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "overworld.h"
|
#include "overworld.h"
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "party_menu.h"
|
#include "party_menu.h"
|
||||||
@ -1679,6 +1680,7 @@ void StartEscalatorWarp(u8 metatileBehavior, u8 priority)
|
|||||||
{
|
{
|
||||||
gTasks[taskId].tGoingUp = TRUE;
|
gTasks[taskId].tGoingUp = TRUE;
|
||||||
}
|
}
|
||||||
|
EndORASDowsing();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Task_EscalatorWarpOut(u8 taskId)
|
static void Task_EscalatorWarpOut(u8 taskId)
|
||||||
@ -2065,6 +2067,7 @@ static bool8 DiveFieldEffect_TryWarp(struct Task *task)
|
|||||||
|
|
||||||
void StartLavaridgeGymB1FWarp(u8 priority)
|
void StartLavaridgeGymB1FWarp(u8 priority)
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
CreateTask(Task_LavaridgeGymB1FWarp, priority);
|
CreateTask(Task_LavaridgeGymB1FWarp, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2273,6 +2276,7 @@ void SpriteCB_AshLaunch(struct Sprite *sprite)
|
|||||||
|
|
||||||
void StartLavaridgeGym1FWarp(u8 priority)
|
void StartLavaridgeGym1FWarp(u8 priority)
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
CreateTask(Task_LavaridgeGym1FWarp, priority);
|
CreateTask(Task_LavaridgeGym1FWarp, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2395,6 +2399,7 @@ void StartEscapeRopeFieldEffect(void)
|
|||||||
LockPlayerFieldControls();
|
LockPlayerFieldControls();
|
||||||
FreezeObjectEvents();
|
FreezeObjectEvents();
|
||||||
HideFollowerForFieldEffect(); // hide follower before warping
|
HideFollowerForFieldEffect(); // hide follower before warping
|
||||||
|
EndORASDowsing();
|
||||||
CreateTask(Task_EscapeRopeWarpOut, 80);
|
CreateTask(Task_EscapeRopeWarpOut, 80);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2589,6 +2594,7 @@ static void TeleportWarpOutFieldEffect_Init(struct Task *task)
|
|||||||
LockPlayerFieldControls();
|
LockPlayerFieldControls();
|
||||||
FreezeObjectEvents();
|
FreezeObjectEvents();
|
||||||
CameraObjectFreeze();
|
CameraObjectFreeze();
|
||||||
|
EndORASDowsing();
|
||||||
task->data[15] = GetPlayerFacingDirection();
|
task->data[15] = GetPlayerFacingDirection();
|
||||||
task->tState++;
|
task->tState++;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1903,4 +1903,3 @@ static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevatio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
#include "follower_npc.h"
|
#include "follower_npc.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "metatile_behavior.h"
|
#include "metatile_behavior.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "overworld.h"
|
#include "overworld.h"
|
||||||
#include "party_menu.h"
|
#include "party_menu.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
@ -363,6 +364,8 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define sCounter data[3]
|
||||||
|
|
||||||
static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEvent, u8 direction)
|
static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEvent, u8 direction)
|
||||||
{
|
{
|
||||||
if (ObjectEventIsMovementOverridden(playerObjEvent)
|
if (ObjectEventIsMovementOverridden(playerObjEvent)
|
||||||
@ -371,6 +374,8 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve
|
|||||||
u8 heldMovementActionId = ObjectEventGetHeldMovementActionId(playerObjEvent);
|
u8 heldMovementActionId = ObjectEventGetHeldMovementActionId(playerObjEvent);
|
||||||
if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN)
|
if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN)
|
||||||
{
|
{
|
||||||
|
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||||
|
|
||||||
if (direction == DIR_NONE)
|
if (direction == DIR_NONE)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -378,12 +383,21 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve
|
|||||||
|
|
||||||
if (playerObjEvent->movementDirection != direction)
|
if (playerObjEvent->movementDirection != direction)
|
||||||
{
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
gSprites[playerObj->fieldEffectSpriteId].sCounter = 0;
|
||||||
|
|
||||||
ObjectEventClearHeldMovement(playerObjEvent);
|
ObjectEventClearHeldMovement(playerObjEvent);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CheckForPlayerAvatarStaticCollision(direction) == COLLISION_NONE)
|
if (CheckForPlayerAvatarStaticCollision(direction) == COLLISION_NONE)
|
||||||
{
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
{
|
||||||
|
gSprites[playerObj->fieldEffectSpriteId].sCounter = 0;
|
||||||
|
gSprites[playerObj->fieldEffectSpriteId].y2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ObjectEventClearHeldMovement(playerObjEvent);
|
ObjectEventClearHeldMovement(playerObjEvent);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -395,6 +409,8 @@ static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *playerObjEve
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef sCounter
|
||||||
|
|
||||||
static void npc_clear_strange_bits(struct ObjectEvent *objEvent)
|
static void npc_clear_strange_bits(struct ObjectEvent *objEvent)
|
||||||
{
|
{
|
||||||
objEvent->inanimate = FALSE;
|
objEvent->inanimate = FALSE;
|
||||||
@ -824,8 +840,12 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH)
|
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER)
|
||||||
&& IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0 && !FollowerNPCComingThroughDoor())
|
&& (heldKeys & B_BUTTON)
|
||||||
|
&& FlagGet(FLAG_SYS_B_DASH)
|
||||||
|
&& IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0
|
||||||
|
&& !FollowerNPCComingThroughDoor()
|
||||||
|
&& (I_ORAS_DOWSING_FLAG == 0 || (I_ORAS_DOWSING_FLAG != 0 && !FlagGet(I_ORAS_DOWSING_FLAG))))
|
||||||
{
|
{
|
||||||
if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction))
|
if (ObjectMovingOnRockStairs(&gObjectEvents[gPlayerAvatar.objectEventId], direction))
|
||||||
PlayerRunSlow(direction);
|
PlayerRunSlow(direction);
|
||||||
@ -1626,12 +1646,14 @@ void SetPlayerInvisibility(bool8 invisible)
|
|||||||
|
|
||||||
void SetPlayerAvatarFieldMove(void)
|
void SetPlayerAvatarFieldMove(void)
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FIELD_MOVE));
|
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FIELD_MOVE));
|
||||||
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE);
|
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetPlayerAvatarFishing(u8 direction)
|
void SetPlayerAvatarFishing(u8 direction)
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FISHING));
|
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FISHING));
|
||||||
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingDirectionAnimNum(direction));
|
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingDirectionAnimNum(direction));
|
||||||
}
|
}
|
||||||
@ -1645,6 +1667,7 @@ void PlayerUseAcroBikeOnBumpySlope(u8 direction)
|
|||||||
|
|
||||||
void SetPlayerAvatarWatering(u8 direction)
|
void SetPlayerAvatarWatering(u8 direction)
|
||||||
{
|
{
|
||||||
|
EndORASDowsing();
|
||||||
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_WATERING));
|
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_WATERING));
|
||||||
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFaceDirectionAnimNum(direction));
|
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFaceDirectionAnimNum(direction));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
#include "mirage_tower.h"
|
#include "mirage_tower.h"
|
||||||
#include "metatile_behavior.h"
|
#include "metatile_behavior.h"
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "overworld.h"
|
#include "overworld.h"
|
||||||
#include "scanline_effect.h"
|
#include "scanline_effect.h"
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
@ -684,6 +685,7 @@ void Task_WarpAndLoadMap(u8 taskId)
|
|||||||
case 0:
|
case 0:
|
||||||
FreezeObjectEvents();
|
FreezeObjectEvents();
|
||||||
LockPlayerFieldControls();
|
LockPlayerFieldControls();
|
||||||
|
EndORASDowsing();
|
||||||
task->tState++;
|
task->tState++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@ -745,6 +747,7 @@ void Task_DoDoorWarp(u8 taskId)
|
|||||||
ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL);
|
ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL);
|
||||||
}
|
}
|
||||||
task->tDoorTask = FieldAnimateDoorOpen(*x, *y - 1);
|
task->tDoorTask = FieldAnimateDoorOpen(*x, *y - 1);
|
||||||
|
EndORASDowsing();
|
||||||
task->tState = DOORWARP_START_WALK_UP;
|
task->tState = DOORWARP_START_WALK_UP;
|
||||||
break;
|
break;
|
||||||
case DOORWARP_START_WALK_UP:
|
case DOORWARP_START_WALK_UP:
|
||||||
|
|||||||
@ -29,6 +29,7 @@
|
|||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "menu_helpers.h"
|
#include "menu_helpers.h"
|
||||||
#include "metatile_behavior.h"
|
#include "metatile_behavior.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "overworld.h"
|
#include "overworld.h"
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "party_menu.h"
|
#include "party_menu.h"
|
||||||
@ -55,8 +56,6 @@ static void Task_UseItemfinder(u8);
|
|||||||
static void Task_CloseItemfinderMessage(u8);
|
static void Task_CloseItemfinderMessage(u8);
|
||||||
static void Task_HiddenItemNearby(u8);
|
static void Task_HiddenItemNearby(u8);
|
||||||
static void Task_StandingOnHiddenItem(u8);
|
static void Task_StandingOnHiddenItem(u8);
|
||||||
static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8);
|
|
||||||
static u8 GetDirectionToHiddenItem(s16, s16);
|
|
||||||
static void PlayerFaceHiddenItem(u8);
|
static void PlayerFaceHiddenItem(u8);
|
||||||
static void CheckForHiddenItemsInMapConnection(u8);
|
static void CheckForHiddenItemsInMapConnection(u8);
|
||||||
static void Task_OpenRegisteredPokeblockCase(u8);
|
static void Task_OpenRegisteredPokeblockCase(u8);
|
||||||
@ -368,10 +367,20 @@ void ItemUseOutOfBattle_Itemfinder(u8 var)
|
|||||||
|
|
||||||
static void ItemUseOnFieldCB_Itemfinder(u8 taskId)
|
static void ItemUseOnFieldCB_Itemfinder(u8 taskId)
|
||||||
{
|
{
|
||||||
if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
|
if (I_ORAS_DOWSING_FLAG != 0)
|
||||||
gTasks[taskId].func = Task_UseItemfinder;
|
{
|
||||||
|
if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && !TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER))
|
||||||
|
gTasks[taskId].func = Task_UseORASDowsingMachine;
|
||||||
|
else
|
||||||
|
DisplayItemMessageOnField(taskId, gText_DadsAdvice, Task_CloseItemfinderMessage);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
DisplayItemMessageOnField(taskId, sText_ItemFinderNothing, Task_CloseItemfinderMessage);
|
{
|
||||||
|
if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
|
||||||
|
gTasks[taskId].func = Task_UseItemfinder;
|
||||||
|
else
|
||||||
|
DisplayItemMessageOnField(taskId, sText_ItemFinderNothing, Task_CloseItemfinderMessage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define itemfinder task data
|
// Define itemfinder task data
|
||||||
@ -427,12 +436,15 @@ static void Task_CloseItemfinderMessage(u8 taskId)
|
|||||||
DestroyTask(taskId);
|
DestroyTask(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId)
|
bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId)
|
||||||
{
|
{
|
||||||
int itemX, itemY;
|
int itemX, itemY;
|
||||||
s16 playerX, playerY, i, distanceX, distanceY;
|
s16 playerX, playerY, i, distanceX, distanceY;
|
||||||
PlayerGetDestCoords(&playerX, &playerY);
|
PlayerGetDestCoords(&playerX, &playerY);
|
||||||
gTasks[taskId].tItemFound = FALSE;
|
if (I_ORAS_DOWSING_FLAG != 0)
|
||||||
|
gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].tItemFound = FALSE;
|
||||||
|
else
|
||||||
|
gTasks[taskId].tItemFound = FALSE;
|
||||||
|
|
||||||
for (i = 0; i < events->bgEventCount; i++)
|
for (i = 0; i < events->bgEventCount; i++)
|
||||||
{
|
{
|
||||||
@ -452,7 +464,7 @@ static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 ta
|
|||||||
}
|
}
|
||||||
|
|
||||||
CheckForHiddenItemsInMapConnection(taskId);
|
CheckForHiddenItemsInMapConnection(taskId);
|
||||||
if (gTasks[taskId].tItemFound == TRUE)
|
if (gTasks[taskId].tItemFound == TRUE || gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].tItemFound)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -551,6 +563,8 @@ static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 itemDistanceX, s16 ite
|
|||||||
{
|
{
|
||||||
s16 *data = gTasks[taskId].data;
|
s16 *data = gTasks[taskId].data;
|
||||||
s16 oldItemAbsX, oldItemAbsY, newItemAbsX, newItemAbsY;
|
s16 oldItemAbsX, oldItemAbsY, newItemAbsX, newItemAbsY;
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0)
|
||||||
|
data = gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].data;
|
||||||
|
|
||||||
if (tItemFound == FALSE)
|
if (tItemFound == FALSE)
|
||||||
{
|
{
|
||||||
@ -607,7 +621,7 @@ static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 itemDistanceX, s16 ite
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 GetDirectionToHiddenItem(s16 itemDistanceX, s16 itemDistanceY)
|
u8 GetDirectionToHiddenItem(s16 itemDistanceX, s16 itemDistanceY)
|
||||||
{
|
{
|
||||||
s16 absX, absY;
|
s16 absX, absY;
|
||||||
|
|
||||||
|
|||||||
562
src/oras_dowse.c
Normal file
562
src/oras_dowse.c
Normal file
@ -0,0 +1,562 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
|
#include "bike.h"
|
||||||
|
#include "event_data.h"
|
||||||
|
#include "event_object_lock.h"
|
||||||
|
#include "event_object_movement.h"
|
||||||
|
#include "field_effect.h"
|
||||||
|
#include "field_effect_helpers.h"
|
||||||
|
#include "field_player_avatar.h"
|
||||||
|
#include "fldeff.h"
|
||||||
|
#include "item_use.h"
|
||||||
|
#include "palette.h"
|
||||||
|
#include "script.h"
|
||||||
|
#include "sound.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "constants/field_effects.h"
|
||||||
|
#include "constants/songs.h"
|
||||||
|
#include "constants/rgb.h"
|
||||||
|
|
||||||
|
static void StartORASDowseFieldEffect(void);
|
||||||
|
static void UpdateORASDowsingFieldEffect(struct Sprite *sprite);
|
||||||
|
static void ChangeDowsingColor(u8 direction, struct Sprite *sprite);
|
||||||
|
static void ClearDowsingColor(struct Sprite *sprite);
|
||||||
|
static void PlayDowseSound(u32 dowseState);
|
||||||
|
|
||||||
|
const u32 gFieldEffectObjectPic_ORASDowsingBrendan[] = INCBIN_U32("graphics/field_effects/pics/oras_dowsing_brendan.4bpp");
|
||||||
|
const u32 gFieldEffectObjectPic_ORASDowsingMay[] = INCBIN_U32("graphics/field_effects/pics/oras_dowsing_may.4bpp");
|
||||||
|
const u16 gFieldEffectPal_ORASDowsing[] = INCBIN_U16("graphics/field_effects/palettes/oras_dowsing.gbapal");
|
||||||
|
|
||||||
|
static const struct SpriteFrameImage sPicTable_ORASDowsingBrendan[] = {
|
||||||
|
overworld_ascending_frames(gFieldEffectObjectPic_ORASDowsingBrendan, 2, 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct SpriteFrameImage sPicTable_ORASDowsingMay[] = {
|
||||||
|
overworld_ascending_frames(gFieldEffectObjectPic_ORASDowsingMay, 2, 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_FaceSouth[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_FaceNorth[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(1, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_FaceWest[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_FaceEast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleSouthSlow[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 32),
|
||||||
|
ANIMCMD_FRAME(0, 32),
|
||||||
|
ANIMCMD_FRAME(4, 32),
|
||||||
|
ANIMCMD_FRAME(4, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleNorthSlow[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(1, 32),
|
||||||
|
ANIMCMD_FRAME(1, 32),
|
||||||
|
ANIMCMD_FRAME(6, 32),
|
||||||
|
ANIMCMD_FRAME(6, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleWestSlow[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 32),
|
||||||
|
ANIMCMD_FRAME(2, 32),
|
||||||
|
ANIMCMD_FRAME(8, 32),
|
||||||
|
ANIMCMD_FRAME(8, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleEastSlow[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(2, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(8, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(8, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleSouth[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 32),
|
||||||
|
ANIMCMD_FRAME(3, 32),
|
||||||
|
ANIMCMD_FRAME(0, 32),
|
||||||
|
ANIMCMD_FRAME(4, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleNorth[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(1, 32),
|
||||||
|
ANIMCMD_FRAME(5, 32),
|
||||||
|
ANIMCMD_FRAME(1, 32),
|
||||||
|
ANIMCMD_FRAME(6, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleWest[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 32),
|
||||||
|
ANIMCMD_FRAME(7, 32),
|
||||||
|
ANIMCMD_FRAME(2, 32),
|
||||||
|
ANIMCMD_FRAME(8, 32),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleEast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(7, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(2, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(8, 32, .hFlip = TRUE),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleSouthFast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 16),
|
||||||
|
ANIMCMD_FRAME(3, 16),
|
||||||
|
ANIMCMD_FRAME(0, 16),
|
||||||
|
ANIMCMD_FRAME(4, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleNorthFast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(1, 16),
|
||||||
|
ANIMCMD_FRAME(5, 16),
|
||||||
|
ANIMCMD_FRAME(1, 16),
|
||||||
|
ANIMCMD_FRAME(6, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleWestFast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 16),
|
||||||
|
ANIMCMD_FRAME(7, 16),
|
||||||
|
ANIMCMD_FRAME(2, 16),
|
||||||
|
ANIMCMD_FRAME(8, 16),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleEastFast[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(7, 16, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(8, 16, .hFlip = TRUE),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleSouthFaster[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 8),
|
||||||
|
ANIMCMD_FRAME(3, 8),
|
||||||
|
ANIMCMD_FRAME(0, 8),
|
||||||
|
ANIMCMD_FRAME(4, 8),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleNorthFaster[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(1, 8),
|
||||||
|
ANIMCMD_FRAME(5, 8),
|
||||||
|
ANIMCMD_FRAME(1, 8),
|
||||||
|
ANIMCMD_FRAME(6, 8),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleWestFaster[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 8),
|
||||||
|
ANIMCMD_FRAME(7, 8),
|
||||||
|
ANIMCMD_FRAME(2, 8),
|
||||||
|
ANIMCMD_FRAME(8, 8),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_ORASDowseWiggleEastFaster[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(7, 8, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
|
||||||
|
ANIMCMD_FRAME(8, 8, .hFlip = TRUE),
|
||||||
|
ANIMCMD_JUMP(0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const union AnimCmd *const sAnimTable_ORASDowsing[] =
|
||||||
|
{
|
||||||
|
[ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth,
|
||||||
|
[ANIM_STD_FACE_NORTH] = sAnim_FaceNorth,
|
||||||
|
[ANIM_STD_FACE_WEST] = sAnim_FaceWest,
|
||||||
|
[ANIM_STD_FACE_EAST] = sAnim_FaceEast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_SOUTH_SLOW] = sAnim_ORASDowseWiggleSouthSlow,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_NORTH_SLOW] = sAnim_ORASDowseWiggleNorthSlow,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_WEST_SLOW] = sAnim_ORASDowseWiggleWestSlow,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_EAST_SLOW] = sAnim_ORASDowseWiggleEastSlow,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_SOUTH] = sAnim_ORASDowseWiggleSouth,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_NORTH] = sAnim_ORASDowseWiggleNorth,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_WEST] = sAnim_ORASDowseWiggleWest,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_EAST] = sAnim_ORASDowseWiggleEast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FAST] = sAnim_ORASDowseWiggleSouthFast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_NORTH_FAST] = sAnim_ORASDowseWiggleNorthFast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_WEST_FAST] = sAnim_ORASDowseWiggleWestFast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_EAST_FAST] = sAnim_ORASDowseWiggleEastFast,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_SOUTH_FASTER] = sAnim_ORASDowseWiggleSouthFaster,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_NORTH_FASTER] = sAnim_ORASDowseWiggleNorthFaster,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_WEST_FASTER] = sAnim_ORASDowseWiggleWestFaster,
|
||||||
|
[ANIM_ORAS_DOWSE_WIGGLE_EAST_FASTER] = sAnim_ORASDowseWiggleEastFaster,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct OamData gObjectEventOam_ORASDowse = {
|
||||||
|
.shape = SPRITE_SHAPE(16x32),
|
||||||
|
.size = SPRITE_SIZE(16x32),
|
||||||
|
.priority = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingBrendan = {
|
||||||
|
.tileTag = TAG_NONE,
|
||||||
|
.paletteTag = FLDEFF_PAL_TAG_ORAS_DOWSE,
|
||||||
|
.oam = &gObjectEventOam_ORASDowse,
|
||||||
|
.anims = sAnimTable_ORASDowsing,
|
||||||
|
.images = sPicTable_ORASDowsingBrendan,
|
||||||
|
.affineAnims = gDummySpriteAffineAnimTable,
|
||||||
|
.callback = UpdateORASDowsingFieldEffect,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct SpriteTemplate gFieldEffectObjectTemplate_ORASDowsingMay = {
|
||||||
|
.tileTag = TAG_NONE,
|
||||||
|
.paletteTag = FLDEFF_PAL_TAG_ORAS_DOWSE,
|
||||||
|
.oam = &gObjectEventOam_ORASDowse,
|
||||||
|
.anims = sAnimTable_ORASDowsing,
|
||||||
|
.images = sPicTable_ORASDowsingMay,
|
||||||
|
.affineAnims = gDummySpriteAffineAnimTable,
|
||||||
|
.callback = UpdateORASDowsingFieldEffect,
|
||||||
|
};
|
||||||
|
|
||||||
|
void Task_UseORASDowsingMachine(u8 taskId)
|
||||||
|
{
|
||||||
|
if (FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
{
|
||||||
|
EndORASDowsing();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE))
|
||||||
|
GetOnOffBike(0);
|
||||||
|
|
||||||
|
StartORASDowseFieldEffect();
|
||||||
|
}
|
||||||
|
ScriptUnfreezeObjectEvents();
|
||||||
|
UnlockPlayerFieldControls();
|
||||||
|
DestroyTask(taskId);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void StartORASDowseFieldEffect(void)
|
||||||
|
{
|
||||||
|
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||||
|
|
||||||
|
gFieldEffectArguments[0] = playerObj->currentCoords.x;
|
||||||
|
gFieldEffectArguments[1] = playerObj->currentCoords.y;
|
||||||
|
FieldEffectStart(FLDEFF_ORAS_DOWSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResumeORASDowseFieldEffect(void)
|
||||||
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
StartORASDowseFieldEffect();
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct SpritePalette gSpritePalette_ORASDowsing = {gFieldEffectPal_ORASDowsing, FLDEFF_PAL_TAG_ORAS_DOWSE};
|
||||||
|
|
||||||
|
// Sprite data for ORAS Dowsing Machine
|
||||||
|
#define tItemDistanceX data[0]
|
||||||
|
#define tItemDistanceY data[1]
|
||||||
|
#define sItemFound data[2]
|
||||||
|
#define sCounter data[3]
|
||||||
|
#define sSoundTimer data[4]
|
||||||
|
#define sDowseState data[5]
|
||||||
|
#define sPrevDowseState data[6]
|
||||||
|
#define sMoveActive data[7]
|
||||||
|
|
||||||
|
#define fPlayerX gFieldEffectArguments[0]
|
||||||
|
#define fPlayerY gFieldEffectArguments[1]
|
||||||
|
|
||||||
|
// Create the ORAS Dowsing Machine sprite.
|
||||||
|
u32 FldEff_ORASDowsing(void)
|
||||||
|
{
|
||||||
|
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||||
|
u32 spriteId;
|
||||||
|
u32 palNum;
|
||||||
|
|
||||||
|
FlagSet(I_ORAS_DOWSING_FLAG);
|
||||||
|
SetSpritePosToOffsetMapCoords((s16 *)&fPlayerX, (s16 *)&fPlayerY, 8, 0);
|
||||||
|
if (gPlayerAvatar.gender == MALE)
|
||||||
|
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ORAS_DOWSE_BRENDAN], fPlayerX, fPlayerY, 1);
|
||||||
|
else
|
||||||
|
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ORAS_DOWSE_MAY], fPlayerX, fPlayerY, 1);
|
||||||
|
|
||||||
|
if (spriteId != MAX_SPRITES)
|
||||||
|
{
|
||||||
|
struct Sprite *sprite = &gSprites[spriteId];
|
||||||
|
sprite->coordOffsetEnabled = TRUE;
|
||||||
|
palNum = LoadSpritePalette(&gSpritePalette_ORASDowsing);
|
||||||
|
if (palNum != 0xFF)
|
||||||
|
sprite->oam.paletteNum = palNum;
|
||||||
|
else
|
||||||
|
sprite->oam.paletteNum = LoadPlayerObjectEventPalette(gSaveBlock2Ptr->playerGender);
|
||||||
|
|
||||||
|
playerObj->fieldEffectSpriteId = spriteId;
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_NONE;
|
||||||
|
UpdateDowseState(sprite);
|
||||||
|
}
|
||||||
|
FieldEffectActiveListRemove(FLDEFF_ORAS_DOWSE);
|
||||||
|
return spriteId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback for ORAS Dowsing Machine sprite.
|
||||||
|
static void UpdateORASDowsingFieldEffect(struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||||
|
struct Sprite *playerSprite = &gSprites[playerObj->spriteId];
|
||||||
|
|
||||||
|
if (!FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
{
|
||||||
|
DestroySpriteAndFreeResources(sprite);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprite->x = playerSprite->x;
|
||||||
|
sprite->y = playerSprite->y;
|
||||||
|
sprite->x2 = playerSprite->x2;
|
||||||
|
sprite->y2 = playerSprite->y2;
|
||||||
|
|
||||||
|
if (playerSprite->anims[playerSprite->animNum][playerSprite->animCmdIndex].frame.imageValue > 2)
|
||||||
|
sprite->y2++;
|
||||||
|
|
||||||
|
if (playerObj->previousMovementDirection != playerObj->movementDirection)
|
||||||
|
UpdateDowsingAnimDirection(sprite, playerObj);
|
||||||
|
|
||||||
|
if (playerObj->movementActionId != MOVEMENT_ACTION_NONE)
|
||||||
|
{
|
||||||
|
if (playerObj->heldMovementFinished == FALSE)
|
||||||
|
{
|
||||||
|
if (sprite->sCounter == 0)
|
||||||
|
{
|
||||||
|
sprite->sMoveActive = TRUE;
|
||||||
|
sprite->sCounter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (playerObj->heldMovementFinished == TRUE && sprite->sMoveActive)
|
||||||
|
{
|
||||||
|
sprite->sMoveActive = FALSE;
|
||||||
|
sprite->sCounter = 0;
|
||||||
|
UpdateDowseState(sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (I_ORAS_DOWSING_SOUNDS && sprite->sDowseState == ORASD_WIGGLE_FASTER && playerObj->heldMovementFinished != FALSE)
|
||||||
|
{
|
||||||
|
if (++sprite->sSoundTimer == 70)
|
||||||
|
{
|
||||||
|
PlaySE(SE_ITEMFINDER);
|
||||||
|
sprite->sSoundTimer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sprite->oam.priority = playerSprite->oam.priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const u8 sClockwiseDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST};
|
||||||
|
|
||||||
|
void UpdateDowseState(struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||||
|
|
||||||
|
sprite->tItemDistanceX = 0;
|
||||||
|
sprite->tItemDistanceY = 0;
|
||||||
|
sprite->sPrevDowseState = sprite->sDowseState;
|
||||||
|
if (ItemfinderCheckForHiddenItems(gMapHeader.events, TASK_NONE) == TRUE)
|
||||||
|
{
|
||||||
|
s8 distX = sprite->tItemDistanceX;
|
||||||
|
s8 distY = sprite->tItemDistanceY;
|
||||||
|
u8 directionToItem = CARDINAL_DIRECTION_COUNT;
|
||||||
|
u8 playerDirToItem = GetDirectionToHiddenItem(distX, distY);
|
||||||
|
if (playerDirToItem != DIR_NONE)
|
||||||
|
directionToItem = sClockwiseDirections[GetDirectionToHiddenItem(distX, distY) - 1];
|
||||||
|
|
||||||
|
if (distX < 0)
|
||||||
|
distX *= -1;
|
||||||
|
|
||||||
|
if (distY < 0)
|
||||||
|
distY *= -1;
|
||||||
|
|
||||||
|
// If the player is facing the item's direction.
|
||||||
|
if (directionToItem == playerObj->movementDirection)
|
||||||
|
{
|
||||||
|
ChangeDowsingColor(directionToItem, sprite);
|
||||||
|
}
|
||||||
|
// If x and y distances are equal, make sure item can bee seen from both facing directions.
|
||||||
|
else if (distX == distY && distX != 0)
|
||||||
|
{
|
||||||
|
if ((directionToItem == DIR_NORTH || directionToItem == DIR_SOUTH) && sprite->tItemDistanceX > 0 && playerObj->movementDirection == DIR_EAST)
|
||||||
|
ChangeDowsingColor(DIR_EAST, sprite);
|
||||||
|
else if ((directionToItem == DIR_NORTH || directionToItem == DIR_SOUTH) && sprite->tItemDistanceX < 0 && playerObj->movementDirection == DIR_WEST)
|
||||||
|
ChangeDowsingColor(DIR_WEST, sprite);
|
||||||
|
else
|
||||||
|
ClearDowsingColor(sprite);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClearDowsingColor(sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClearDowsingColor(sprite);
|
||||||
|
}
|
||||||
|
UpdateDowsingAnimDirection(sprite, playerObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ChangeDowsingColor(u8 direction, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
s16 distance;
|
||||||
|
u16 color = I_ORAS_DOWSING_COLOR_NONE;
|
||||||
|
|
||||||
|
if (direction == DIR_NORTH || direction == DIR_SOUTH)
|
||||||
|
distance = sprite->tItemDistanceY;
|
||||||
|
else
|
||||||
|
distance = sprite->tItemDistanceX;
|
||||||
|
|
||||||
|
// Absolute value.
|
||||||
|
if (distance < 0)
|
||||||
|
distance *= -1;
|
||||||
|
|
||||||
|
switch (distance)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (sprite->tItemDistanceX == 0 || sprite->tItemDistanceY == 0)
|
||||||
|
{
|
||||||
|
color = I_ORAS_DOWSING_COLOR_FASTER;
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_FASTER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
color = I_ORAS_DOWSING_COLOR_FAST;
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_FAST;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
color = I_ORAS_DOWSING_COLOR_NORMAL;
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_NORMAL;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
color = I_ORAS_DOWSING_COLOR_SLOW;
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_SLOW;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (I_ORAS_DOWSING_SOUNDS && sprite->sDowseState != sprite->sPrevDowseState)
|
||||||
|
{
|
||||||
|
sprite->sSoundTimer = 0;
|
||||||
|
PlayDowseSound(sprite->sDowseState);
|
||||||
|
}
|
||||||
|
|
||||||
|
FillPalette(color, (OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)) + I_ORAS_DOWSING_COLOR_PAL), PLTT_SIZEOF(1));
|
||||||
|
UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ClearDowsingColor(struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
sprite->sDowseState = ORASD_WIGGLE_NONE;
|
||||||
|
FillPalette(I_ORAS_DOWSING_COLOR_NONE, (OBJ_PLTT_ID(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE)) + I_ORAS_DOWSING_COLOR_PAL), PLTT_SIZEOF(1));
|
||||||
|
UpdateSpritePaletteWithTime(IndexOfSpritePaletteTag(FLDEFF_PAL_TAG_ORAS_DOWSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PlayDowseSound(u32 dowseState)
|
||||||
|
{
|
||||||
|
switch (dowseState)
|
||||||
|
{
|
||||||
|
case ORASD_WIGGLE_SLOW:
|
||||||
|
PlaySE(SE_CONTEST_ICON_CLEAR);
|
||||||
|
return;
|
||||||
|
case ORASD_WIGGLE_NORMAL:
|
||||||
|
PlaySE(SE_PIN);
|
||||||
|
return;
|
||||||
|
case ORASD_WIGGLE_FAST:
|
||||||
|
PlaySE(SE_SUCCESS);
|
||||||
|
return;
|
||||||
|
case ORASD_WIGGLE_FASTER:
|
||||||
|
PlaySE(SE_ITEMFINDER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateDowsingAnimDirection(struct Sprite *sprite, struct ObjectEvent *playerObj)
|
||||||
|
{
|
||||||
|
u32 anim = (playerObj->facingDirection - 1);
|
||||||
|
|
||||||
|
switch (sprite->sDowseState)
|
||||||
|
{
|
||||||
|
case ORASD_WIGGLE_SLOW:
|
||||||
|
anim += 4;
|
||||||
|
break;
|
||||||
|
case ORASD_WIGGLE_NORMAL:
|
||||||
|
anim += 8;
|
||||||
|
break;
|
||||||
|
case ORASD_WIGGLE_FAST:
|
||||||
|
anim += 12;
|
||||||
|
break;
|
||||||
|
case ORASD_WIGGLE_FASTER:
|
||||||
|
anim += 16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't completely restart anim if wiggling didn't stop.
|
||||||
|
if (sprite->sPrevDowseState != ORASD_WIGGLE_NONE && sprite->sDowseState != ORASD_WIGGLE_NONE)
|
||||||
|
SetAndStartSpriteAnim(sprite, anim, sprite->animCmdIndex);
|
||||||
|
else
|
||||||
|
StartSpriteAnimIfDifferent(sprite, anim);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndORASDowsing(void)
|
||||||
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
FlagClear(I_ORAS_DOWSING_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Script_ClearDowsingColor(void)
|
||||||
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
{
|
||||||
|
struct Sprite *sprite = &gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId];
|
||||||
|
ClearDowsingColor(sprite);
|
||||||
|
UpdateDowsingAnimDirection(sprite, &gObjectEvents[gPlayerAvatar.objectEventId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Script_UpdateDowseState(void)
|
||||||
|
{
|
||||||
|
if (I_ORAS_DOWSING_FLAG != 0 && FlagGet(I_ORAS_DOWSING_FLAG))
|
||||||
|
UpdateDowseState(&gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId]);
|
||||||
|
}
|
||||||
@ -43,6 +43,7 @@
|
|||||||
#include "mirage_tower.h"
|
#include "mirage_tower.h"
|
||||||
#include "money.h"
|
#include "money.h"
|
||||||
#include "new_game.h"
|
#include "new_game.h"
|
||||||
|
#include "oras_dowse.h"
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "play_time.h"
|
#include "play_time.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
@ -2240,6 +2241,7 @@ static bool32 ReturnToFieldLocal(u8 *state)
|
|||||||
InitViewGraphics();
|
InitViewGraphics();
|
||||||
TryLoadTrainerHillEReaderPalette();
|
TryLoadTrainerHillEReaderPalette();
|
||||||
FollowerNPC_BindToSurfBlobOnReloadScreen();
|
FollowerNPC_BindToSurfBlobOnReloadScreen();
|
||||||
|
ResumeORASDowseFieldEffect();
|
||||||
(*state)++;
|
(*state)++;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user