diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 03c093e41..0a96b1499 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1764,6 +1764,12 @@ .byte 0xd6 .endm + @ Checks if effect can be used + .macro checkfieldmoveusable effect:req + .byte 0xd7 + .2byte \effect + .endm + @ Equivalent to fadescreen but copies gPlttBufferUnfaded to gDecompressionBuffer on the fade out @ and the reverse on the fade in, in effect saving gPlttBufferUnfaded to restore it. @ If nowait set, does not wait for the fade to complete diff --git a/data/event_scripts.s b/data/event_scripts.s index f905447f7..7fd4f38df 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -5,6 +5,7 @@ #include "constants/battle_tower.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" +#include "constants/field_move.h" #include "constants/decorations.h" #include "constants/item.h" #include "constants/items.h" diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index af639b661..840a3b44d 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -216,7 +216,7 @@ gScriptCmdTable:: .4byte ScrCmd_bufferitemnameplural @ 0xd4 .4byte ScrCmd_selectapproachingtrainer @ 0xd5 .4byte ScrCmd_lockfortrainer @ 0xd6 - .4byte ScrCmd_nop1 @ 0xd7 + .4byte ScrCmd_checkfieldmoveusable @ 0xd7 .4byte ScrCmd_nop1 @ 0xd8 .4byte ScrCmd_nop1 @ 0xd9 .4byte ScrCmd_nop1 @ 0xda diff --git a/data/scripts/field_moves.inc b/data/scripts/field_moves.inc index b0bd43ae8..2288413f4 100644 --- a/data/scripts/field_moves.inc +++ b/data/scripts/field_moves.inc @@ -1,12 +1,8 @@ EventScript_CutTree:: goto_if_questlog EventScript_ReleaseEnd lockall - goto_if_unset FLAG_BADGE02_GET, EventScript_CantCutTree - checkpartymove MOVE_CUT - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantCutTree - setfieldeffectargument 0, VAR_RESULT - bufferpartymonnick STR_VAR_1, VAR_RESULT - buffermovename STR_VAR_2, MOVE_CUT + checkfieldmoveusable FIELD_MOVE_CUT + goto_if_eq VAR_RESULT, FALSE, EventScript_CantCutTree msgbox Text_CutTreeDown, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontCutTree msgbox Text_MonUsedMove @@ -64,12 +60,8 @@ EventScript_FldEffRockSmash:: EventScript_RockSmash:: goto_if_questlog EventScript_ReleaseEnd lockall - goto_if_unset FLAG_BADGE06_GET, EventScript_CantSmashRock - checkpartymove MOVE_ROCK_SMASH - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSmashRock - setfieldeffectargument 0, VAR_RESULT - bufferpartymonnick STR_VAR_1, VAR_RESULT - buffermovename STR_VAR_2, MOVE_ROCK_SMASH + checkfieldmoveusable FIELD_MOVE_ROCK_SMASH + goto_if_eq VAR_RESULT, FALSE, EventScript_CantSmashRock msgbox Text_UseRockSmash, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontSmashRock msgbox Text_MonUsedMove @@ -229,11 +221,9 @@ Text_MonMaySmashRock:: EventScript_StrengthBoulder:: goto_if_questlog EventScript_ReleaseEnd lockall - goto_if_unset FLAG_BADGE04_GET, EventScript_CantMoveBoulder goto_if_set FLAG_SYS_USE_STRENGTH, EventScript_AlreadyUsedStrength - checkpartymove MOVE_STRENGTH - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantMoveBoulder - setfieldeffectargument 0, VAR_RESULT + checkfieldmoveusable FIELD_MOVE_STRENGTH + goto_if_eq VAR_RESULT, FALSE, EventScript_CantMoveBoulder msgbox Text_UseStrength, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_DontUseStrength closemessage @@ -288,10 +278,8 @@ Text_StrengthMadeMovingBouldersPossible:: EventScript_Waterfall:: goto_if_questlog EventScript_ReleaseEnd lockall - checkpartymove MOVE_WATERFALL - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_WaterCrashingDown - bufferpartymonnick STR_VAR_1, VAR_RESULT - setfieldeffectargument 0, VAR_RESULT + checkfieldmoveusable FIELD_MOVE_WATERFALL + goto_if_eq VAR_RESULT, FALSE, EventScript_WaterCrashingDown msgbox Text_UseWaterfall, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndWaterfall msgbox Text_MonUsedWaterfall @@ -320,10 +308,8 @@ Text_MonUsedWaterfall:: @ Unused leftover from R/S EventScript_DeepWater:: lockall - checkpartymove MOVE_DIVE - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_MayGoUnderwater - bufferpartymonnick STR_VAR_1, VAR_RESULT - setfieldeffectargument 0, VAR_RESULT + checkfieldmoveusable FIELD_MOVE_DIVE + goto_if_eq VAR_RESULT, FALSE, EventScript_MayGoUnderwater setfieldeffectargument 1, 1 msgbox Text_SeaIsDeepUseDive, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndDive @@ -341,10 +327,8 @@ EventScript_EndDive: EventScript_TrySurface:: lockall - checkpartymove MOVE_DIVE + checkfieldmoveusable FIELD_MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSurface - bufferpartymonnick STR_VAR_1, VAR_RESULT - setfieldeffectargument 0, VAR_RESULT setfieldeffectargument 1, 1 msgbox Text_LightFilteringUseDive, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_EndSurface diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc index 1cc6f5fad..a4860b1c8 100644 --- a/data/scripts/follower.inc +++ b/data/scripts/follower.inc @@ -16,7 +16,7 @@ EventScript_Follower:: playfirstmoncry getfolloweraction EventScript_FollowerEnd:: - waitfieldeffect FLDEFF_EMOTE + waitfieldeffect FLDEFF_QUESTION_MARK_ICON_AND_EMOTE release end @@ -35,7 +35,7 @@ EventScript_FollowerLovesYou:: EventScript_FollowerGeneric:: @ similar to Std_MsgboxDefault faceplayer EventScript_FollowerGenericSkipFace: - waitfieldeffect FLDEFF_EMOTE + waitfieldeffect FLDEFF_QUESTION_MARK_ICON_AND_EMOTE message 0x0 waitmessage waitbuttonpress @@ -45,7 +45,7 @@ EventScript_FollowerJump:: faceplayer applymovement OBJ_EVENT_ID_FOLLOWER, FollowerSplashMovement waitmovement OBJ_EVENT_ID_FOLLOWER - waitfieldeffect FLDEFF_EMOTE + waitfieldeffect FLDEFF_QUESTION_MARK_ICON_AND_EMOTE message 0x0 waitmessage waitbuttonpress diff --git a/data/scripts/surf.inc b/data/scripts/surf.inc index e7bf85ec7..e2237c96b 100644 --- a/data/scripts/surf.inc +++ b/data/scripts/surf.inc @@ -1,9 +1,8 @@ EventScript_UseSurf:: goto_if_questlog EventScript_UseSurfEnd - checkpartymove MOVE_SURF - goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_UseSurfEnd - bufferpartymonnick STR_VAR_1, VAR_RESULT - setfieldeffectargument 0, VAR_RESULT + checkfieldmoveusable FIELD_MOVE_SURF + goto_if_eq VAR_RESULT, FALSE, EventScript_UseSurfEnd + playse SE_SELECT lockall msgbox Text_WantToSurf, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, EventScript_UseSurfRelease @@ -16,6 +15,10 @@ EventScript_UseSurfEnd: EventScript_CurrentTooFast:: lockall + checkfieldmoveusable FIELD_MOVE_SURF + goto_if_eq VAR_RESULT, FALSE, EventScript_CurrentTooFastEndMsg + playse SE_SELECT msgbox Text_CurrentTooFast +EventScript_CurrentTooFastEndMsg:: releaseall end diff --git a/include/config/overworld.h b/include/config/overworld.h index 048ed4ffb..f6a169799 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -113,4 +113,6 @@ #define OW_UNION_DISABLE_CHECK FALSE // When TRUE, the nurse does not inform the player if there is a trainer waiting in the Union Room. This speeds up the loading of the Pokémon Center. #define OW_FLAG_MOVE_UNION_ROOM_CHECK 0 // If this flag is set, the game will only check if players are in the Union Room while healing Pokémon, and not when players enter the Pokémon Center. This speeds up the loading of the Pokémon Center. This is ignored if OW_UNION_DISABLE_CHECK is TRUE. +#define OW_FIELD_MOVES_WITHOUT_HMS TRUE + #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index da04250ae..0b28afa03 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -1,83 +1,89 @@ #ifndef GUARD_CONSTANTS_FIELD_EFFECTS_H #define GUARD_CONSTANTS_FIELD_EFFECTS_H -#define FLDEFF_EXCLAMATION_MARK_ICON 0 -#define FLDEFF_USE_CUT_ON_GRASS 1 -#define FLDEFF_USE_CUT_ON_TREE 2 -#define FLDEFF_SHADOW 3 -#define FLDEFF_TALL_GRASS 4 -#define FLDEFF_RIPPLE 5 -#define FLDEFF_FIELD_MOVE_SHOW_MON 6 -#define FLDEFF_ASH 7 -#define FLDEFF_SURF_BLOB 8 -#define FLDEFF_USE_SURF 9 -#define FLDEFF_DUST 10 -#define FLDEFF_USE_SECRET_POWER_CAVE 11 -#define FLDEFF_JUMP_TALL_GRASS 12 -#define FLDEFF_SAND_FOOTPRINTS 13 -#define FLDEFF_JUMP_BIG_SPLASH 14 -#define FLDEFF_SPLASH 15 -#define FLDEFF_JUMP_SMALL_SPLASH 16 -#define FLDEFF_LONG_GRASS 17 -#define FLDEFF_JUMP_LONG_GRASS 18 -#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 -#define FLDEFF_USE_SECRET_POWER_TREE 26 -#define FLDEFF_USE_SECRET_POWER_SHRUB 27 -#define FLDEFF_TREE_DISGUISE 28 -#define FLDEFF_MOUNTAIN_DISGUISE 29 -#define FLDEFF_NPCFLY_OUT 30 -#define FLDEFF_FLY_OUT 31 -#define FLDEFF_FLY_IN 32 -#define FLDEFF_QUESTION_MARK_ICON 33 -#define FLDEFF_EMOTE 33 // shares a slot with FLDEFF_QUESTION_MARK_ICON -#define FLDEFF_FEET_IN_FLOWING_WATER 34 -#define FLDEFF_BIKE_TIRE_TRACKS 35 -#define FLDEFF_SAND_DISGUISE 36 -#define FLDEFF_USE_ROCK_SMASH 37 -#define FLDEFF_USE_DIG 38 -#define FLDEFF_SAND_PILE 39 -#define FLDEFF_USE_STRENGTH 40 -#define FLDEFF_SHORT_GRASS 41 -#define FLDEFF_HOT_SPRINGS_WATER 42 -#define FLDEFF_USE_WATERFALL 43 -#define FLDEFF_USE_DIVE 44 -#define FLDEFF_POKEBALL 45 -#define FLDEFF_X_ICON 46 -#define FLDEFF_NOP_47 47 -#define FLDEFF_NOP_48 48 -#define FLDEFF_POP_OUT_OF_ASH 49 -#define FLDEFF_LAVARIDGE_GYM_WARP 50 -#define FLDEFF_SWEET_SCENT 51 -#define FLDEFF_SAND_PILLAR 52 -#define FLDEFF_BUBBLES 53 -#define FLDEFF_SPARKLE 54 -#define FLDEFF_SECRET_POWER_CAVE 55 -#define FLDEFF_SECRET_POWER_TREE 56 -#define FLDEFF_SECRET_POWER_SHRUB 57 -#define FLDEFF_CUT_GRASS 58 -#define FLDEFF_FIELD_MOVE_SHOW_MON_INIT 59 -#define FLDEFF_USE_FLY_ANCIENT_TOMB 60 -#define FLDEFF_PCTURN_ON 61 -#define FLDEFF_HALL_OF_FAME_RECORD 62 -#define FLDEFF_USE_TELEPORT 63 -#define FLDEFF_SMILEY_FACE_ICON 64 -#define FLDEFF_USE_VS_SEEKER 65 -#define FLDEFF_DOUBLE_EXCL_MARK_ICON 66 -#define FLDEFF_MOVE_DEOXYS_ROCK 67 -#define FLDEFF_DESTROY_DEOXYS_ROCK 68 -#define FLDEFF_PHOTO_FLASH 69 -#define FLDEFF_TRACKS_SLITHER 70 -#define FLDEFF_TRACKS_SPOT 71 -#define FLDEFF_TRACKS_BUG 72 -#define FLDEFF_SNOW_FOOTPRINTS 73 -#define FLDEFF_COUNT 74 +enum FieldEffect +{ + + FLDEFF_EXCLAMATION_MARK_ICON, + FLDEFF_USE_CUT_ON_GRASS, + FLDEFF_USE_CUT_ON_TREE, + FLDEFF_SHADOW, + FLDEFF_TALL_GRASS, + FLDEFF_RIPPLE, + FLDEFF_FIELD_MOVE_SHOW_MON, + FLDEFF_ASH, + FLDEFF_SURF_BLOB, + FLDEFF_USE_SURF, + FLDEFF_DUST, + FLDEFF_USE_SECRET_POWER_CAVE, + FLDEFF_JUMP_TALL_GRASS, + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_JUMP_BIG_SPLASH, + FLDEFF_SPLASH, + FLDEFF_JUMP_SMALL_SPLASH, + FLDEFF_LONG_GRASS, + FLDEFF_JUMP_LONG_GRASS, + FLDEFF_UNUSED_GRASS, + FLDEFF_UNUSED_GRASS_2, + FLDEFF_UNUSED_SAND, + FLDEFF_UNUSED_WATER_SURFACING, + FLDEFF_BERRY_TREE_GROWTH_SPARKLE, + FLDEFF_DEEP_SAND_FOOTPRINTS, + FLDEFF_POKECENTER_HEAL, + FLDEFF_USE_SECRET_POWER_TREE, + FLDEFF_USE_SECRET_POWER_SHRUB, + FLDEFF_TREE_DISGUISE, + FLDEFF_MOUNTAIN_DISGUISE, + FLDEFF_NPCFLY_OUT, + FLDEFF_FLY_OUT, + FLDEFF_FLY_IN, + FLDEFF_QUESTION_MARK_ICON_AND_EMOTE, + // FLDEFF_EMOTE, // shares a slot with FLDEFF_QUESTION_MARK_ICON + FLDEFF_FEET_IN_FLOWING_WATER, + FLDEFF_BIKE_TIRE_TRACKS, + FLDEFF_SAND_DISGUISE, + FLDEFF_USE_ROCK_SMASH, + FLDEFF_USE_DIG, + FLDEFF_SAND_PILE, + FLDEFF_USE_STRENGTH, + FLDEFF_SHORT_GRASS, + FLDEFF_HOT_SPRINGS_WATER, + FLDEFF_USE_WATERFALL, + FLDEFF_USE_DIVE, + FLDEFF_POKEBALL, + FLDEFF_X_ICON, + FLDEFF_NOP_47, + FLDEFF_NOP_48, + FLDEFF_POP_OUT_OF_ASH, + FLDEFF_LAVARIDGE_GYM_WARP, + FLDEFF_SWEET_SCENT, + FLDEFF_SAND_PILLAR, + FLDEFF_BUBBLES, + FLDEFF_SPARKLE, + FLDEFF_SECRET_POWER_CAVE, + FLDEFF_SECRET_POWER_TREE, + FLDEFF_SECRET_POWER_SHRUB, + FLDEFF_CUT_GRASS, + FLDEFF_FIELD_MOVE_SHOW_MON_INIT, + FLDEFF_USE_FLY_ANCIENT_TOMB, + FLDEFF_PCTURN_ON, + FLDEFF_HALL_OF_FAME_RECORD, + FLDEFF_USE_TELEPORT, + FLDEFF_SMILEY_FACE_ICON, + FLDEFF_USE_VS_SEEKER, + FLDEFF_DOUBLE_EXCL_MARK_ICON, + FLDEFF_MOVE_DEOXYS_ROCK, + FLDEFF_DESTROY_DEOXYS_ROCK, + FLDEFF_PHOTO_FLASH, + FLDEFF_TRACKS_SLITHER, + FLDEFF_TRACKS_SPOT, + FLDEFF_TRACKS_BUG, + FLDEFF_SNOW_FOOTPRINTS, + FLDEFF_COUNT, +}; + +#define NOT_IN_PARTY_MASK (1 << 12) #define FLDEFF_PAL_TAG_GENERAL_0 0x1004 #define FLDEFF_PAL_TAG_GENERAL_1 0x1005 diff --git a/include/constants/field_move.h b/include/constants/field_move.h new file mode 100644 index 000000000..0ffe7228c --- /dev/null +++ b/include/constants/field_move.h @@ -0,0 +1,25 @@ +#ifndef GUARD_CONSTANTS_FIELD_MOVE_H +#define GUARD_CONSTANTS_FIELD_MOVE_H + +enum FieldMove +{ + FIELD_MOVE_CUT, + FIELD_MOVE_FLY, + FIELD_MOVE_SURF, + FIELD_MOVE_STRENGTH, + FIELD_MOVE_FLASH, + FIELD_MOVE_ROCK_SMASH, + FIELD_MOVE_WATERFALL, + FIELD_MOVE_WHIRLPOOL, + FIELD_MOVE_DIVE, + FIELD_MOVE_DEFOG, + FIELD_MOVE_ROCK_CLIMB, + FIELD_MOVE_TELEPORT, + FIELD_MOVE_DIG, + FIELD_MOVE_MILK_DRINK, + FIELD_MOVE_SOFT_BOILED, + FIELD_MOVE_SWEET_SCENT, + FIELD_MOVE_COUNT, +}; + +#endif // GUARD_CONSTANTS_FIELD_MOVE_H \ No newline at end of file diff --git a/include/constants/field_moves.h b/include/constants/field_moves.h deleted file mode 100644 index 886fafd1b..000000000 --- a/include/constants/field_moves.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef GUARD_CONSTANTS_FIELD_MOVE_H -#define GUARD_CONSTANTS_FIELD_MOVE_H - -#define FIELD_MOVE_CUT 0 -#define FIELD_MOVE_FLY 1 -#define FIELD_MOVE_SURF 2 -#define FIELD_MOVE_STRENGTH 3 -#define FIELD_MOVE_FLASH 4 -#define FIELD_MOVE_ROCK_SMASH 5 -#define FIELD_MOVE_WATERFALL 6 -#define FIELD_MOVE_TELEPORT 7 -#define FIELD_MOVE_DIG 8 -#define FIELD_MOVE_MILK_DRINK 9 -#define FIELD_MOVE_SOFT_BOILED 10 -#define FIELD_MOVE_SWEET_SCENT 11 -#define FIELD_MOVE_COUNT 12 - -#endif // GUARD_CONSTANTS_FIELD_MOVE_H \ No newline at end of file diff --git a/include/field_moves.h b/include/field_move.h similarity index 70% rename from include/field_moves.h rename to include/field_move.h index 3c7d1e7cb..f2de9248b 100644 --- a/include/field_moves.h +++ b/include/field_move.h @@ -1,6 +1,8 @@ #ifndef GUARD_FIELD_MOVE_H #define GUARD_FIELD_MOVE_H +#include "constants/field_move.h" + struct FieldMoveInfo { u16 defaultSpecies; bool32 (*isUnlockedFunc)(void); @@ -13,4 +15,7 @@ struct FieldMoveInfo { extern const struct FieldMoveInfo gFieldMovesInfo[]; +bool32 FieldMove_IsUnlocked(enum FieldMove fieldMove); +u16 FieldMove_GetDefaultSpecies(enum FieldMove fieldMove); + #endif // GUARD_FIELD_MOVE_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 82d9e241c..55ec43fbf 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -34,7 +34,6 @@ void StartTeleportInPlayerAnim(void); void StartTeleportWarpOutPlayerAnim(void); bool32 WaitTeleportWarpOutPlayerAnim(void); bool32 WaitTeleportInPlayerAnim(void); -bool8 PartyHasMonWithSurf(void); bool8 IsPlayerSurfingNorth(void); u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); void StartPlayerAvatarVsSeekerAnim(void); diff --git a/include/party_menu.h b/include/party_menu.h index de34393eb..fddde710e 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -97,5 +97,6 @@ void ItemUseCB_FormChange_ConsumedOnUse(u8 taskId, TaskFunc task); void ItemUseCB_RotomCatalog(u8 taskId, TaskFunc task); void ItemUseCB_ZygardeCube(u8 taskId, TaskFunc task); void ItemUseCB_Fusion(u8 taskId, TaskFunc task); +u32 Party_FirstMonWithMove(u16 moveId); #endif // GUARD_PARTY_MENU_H diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 68dd35e06..b6ed40618 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2361,7 +2361,7 @@ static void ObjectEventEmote(struct ObjectEvent *objEvent, u8 emotion) emotion %= FOLLOWER_EMOTION_LENGTH; ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); gFieldEffectArguments[7] = emotion; - FieldEffectStart(FLDEFF_EMOTE); + FieldEffectStart(FLDEFF_QUESTION_MARK_ICON_AND_EMOTE); } // Find and return direction of metatile behavior within distance @@ -8627,7 +8627,7 @@ static bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *objec static bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_QUESTION_MARK_ICON); + FieldEffectStart(FLDEFF_QUESTION_MARK_ICON_AND_EMOTE); sprite->data[2] = 1; return TRUE; } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index d393dd015..5bc670487 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -397,7 +397,9 @@ static bool8 TryStartInteractionScript(struct MapPosition *position, u16 metatil // Don't play interaction sound for certain scripts. if (script != PalletTown_PlayersHouse_2F_EventScript_PC - && script != EventScript_PC) + && script != EventScript_PC + && script != EventScript_UseSurf + && script != EventScript_CurrentTooFast) PlaySE(SE_SELECT); ScriptContext_SetupScript(script); @@ -621,14 +623,14 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { - if (MetatileBehavior_IsFastWater(metatileBehavior) == TRUE && PartyHasMonWithSurf() == TRUE) + if (MetatileBehavior_IsFastWater(metatileBehavior) == TRUE) return EventScript_CurrentTooFast; - if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + if (IsPlayerFacingSurfableFishableWater() == TRUE) return EventScript_UseSurf; if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE) { - if (FlagGet(FLAG_BADGE07_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + if (IsPlayerSurfingNorth() == TRUE) return EventScript_Waterfall; else return EventScript_CantUseWaterfall; diff --git a/src/field_effect.c b/src/field_effect.c index 76a39904a..c61cbce61 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -71,80 +71,80 @@ static const u16 sRockFragment_BottomRight[] = INCBIN_U16("graphics/field_effect static const u32 (*const sFieldEffectFuncs[FLDEFF_COUNT]) (void) = { - [FLDEFF_EXCLAMATION_MARK_ICON] = FldEff_ExclamationMarkIcon, - [FLDEFF_USE_CUT_ON_GRASS] = FldEff_UseCutOnGrass, - [FLDEFF_USE_CUT_ON_TREE] = FldEff_UseCutOnTree, - [FLDEFF_SHADOW] = FldEff_Shadow, - [FLDEFF_TALL_GRASS] = FldEff_TallGrass, - [FLDEFF_RIPPLE] = FldEff_Ripple, - [FLDEFF_FIELD_MOVE_SHOW_MON] = FldEff_FieldMoveShowMon, - [FLDEFF_ASH] = FldEff_Ash, - [FLDEFF_SURF_BLOB] = FldEff_SurfBlob, - [FLDEFF_USE_SURF] = FldEff_UseSurf, - [FLDEFF_DUST] = FldEff_Dust, - [FLDEFF_USE_SECRET_POWER_CAVE] = FldEff_Nop, - [FLDEFF_JUMP_TALL_GRASS] = FldEff_JumpTallGrass, - [FLDEFF_SAND_FOOTPRINTS] = FldEff_SandFootprints, - [FLDEFF_JUMP_BIG_SPLASH] = FldEff_JumpBigSplash, - [FLDEFF_SPLASH] = FldEff_Splash, - [FLDEFF_JUMP_SMALL_SPLASH] = FldEff_JumpSmallSplash, - [FLDEFF_LONG_GRASS] = FldEff_LongGrass, - [FLDEFF_JUMP_LONG_GRASS] = FldEff_JumpLongGrass, - [FLDEFF_UNUSED_GRASS] = FldEff_UnusedGrass, - [FLDEFF_UNUSED_GRASS_2] = FldEff_UnusedGrass2, - [FLDEFF_UNUSED_SAND] = FldEff_UnusedSand, - [FLDEFF_UNUSED_WATER_SURFACING] = FldEff_UnusedWaterSurfacing, - [FLDEFF_BERRY_TREE_GROWTH_SPARKLE] = FldEff_BerryTreeGrowthSparkle, - [FLDEFF_DEEP_SAND_FOOTPRINTS] = FldEff_DeepSandFootprints, - [FLDEFF_POKECENTER_HEAL] = FldEff_PokecenterHeal, - [FLDEFF_USE_SECRET_POWER_TREE] = FldEff_Nop, - [FLDEFF_USE_SECRET_POWER_SHRUB] = FldEff_Nop, - [FLDEFF_TREE_DISGUISE] = FldEff_TreeDisguise, - [FLDEFF_MOUNTAIN_DISGUISE] = FldEff_MountainDisguise, - [FLDEFF_NPCFLY_OUT] = FldEff_NpcFlyOut, - [FLDEFF_FLY_OUT] = FldEff_FlyOut, - [FLDEFF_FLY_IN] = FldEff_FlyIn, - [FLDEFF_QUESTION_MARK_ICON] = FldEff_QuestionMarkIcon, - [FLDEFF_FEET_IN_FLOWING_WATER] = FldEff_FeetInFlowingWater, - [FLDEFF_BIKE_TIRE_TRACKS] = FldEff_BikeTireTracks, - [FLDEFF_SAND_DISGUISE] = FldEff_SandDisguise, - [FLDEFF_USE_ROCK_SMASH] = FldEff_UseRockSmash, - [FLDEFF_USE_DIG] = FldEff_UseDig, - [FLDEFF_SAND_PILE] = FldEff_SandPile, - [FLDEFF_USE_STRENGTH] = FldEff_UseStrength, - [FLDEFF_SHORT_GRASS] = FldEff_ShortGrass, - [FLDEFF_HOT_SPRINGS_WATER] = FldEff_HotSpringsWater, - [FLDEFF_USE_WATERFALL] = FldEff_UseWaterfall, - [FLDEFF_USE_DIVE] = FldEff_UseDive, - [FLDEFF_POKEBALL] = FldEff_Pokeball, - [FLDEFF_X_ICON] = FldEff_XIcon, - [FLDEFF_NOP_47] = FldEff_Nop, - [FLDEFF_NOP_48] = FldEff_Nop, - [FLDEFF_POP_OUT_OF_ASH] = FldEff_PopOutOfAsh, - [FLDEFF_LAVARIDGE_GYM_WARP] = FldEff_LavaridgeGymWarp, - [FLDEFF_SWEET_SCENT] = FldEff_SweetScent, - [FLDEFF_SAND_PILLAR] = FldEff_Nop, - [FLDEFF_BUBBLES] = FldEff_Bubbles, - [FLDEFF_SPARKLE] = FldEff_Sparkle, - [FLDEFF_SECRET_POWER_CAVE] = FldEff_Nop, - [FLDEFF_SECRET_POWER_TREE] = FldEff_Nop, - [FLDEFF_SECRET_POWER_SHRUB] = FldEff_Nop, - [FLDEFF_CUT_GRASS] = FldEff_CutGrass, - [FLDEFF_FIELD_MOVE_SHOW_MON_INIT] = FldEff_FieldMoveShowMonInit, - [FLDEFF_USE_FLY_ANCIENT_TOMB] = FldEff_Nop, - [FLDEFF_PCTURN_ON] = FldEff_Nop, - [FLDEFF_HALL_OF_FAME_RECORD] = FldEff_HallOfFameRecord, - [FLDEFF_USE_TELEPORT] = FldEff_UseTeleport, - [FLDEFF_SMILEY_FACE_ICON] = FldEff_SmileyFaceIcon, - [FLDEFF_USE_VS_SEEKER] = FldEff_UseVsSeeker, - [FLDEFF_DOUBLE_EXCL_MARK_ICON] = FldEff_DoubleExclMarkIcon, - [FLDEFF_MOVE_DEOXYS_ROCK] = FldEff_MoveDeoxysRock, - [FLDEFF_DESTROY_DEOXYS_ROCK] = FldEff_DestroyDeoxysRock, - [FLDEFF_PHOTO_FLASH] = FldEff_PhotoFlash, - [FLDEFF_TRACKS_SLITHER] = FldEff_TracksSlither, - [FLDEFF_TRACKS_BUG] = FldEff_TracksBug, - [FLDEFF_TRACKS_SPOT] = FldEff_TracksSpot, - [FLDEFF_SNOW_FOOTPRINTS] = FldEff_SnowFootprints, + [FLDEFF_EXCLAMATION_MARK_ICON] = FldEff_ExclamationMarkIcon, + [FLDEFF_USE_CUT_ON_GRASS] = FldEff_UseCutOnGrass, + [FLDEFF_USE_CUT_ON_TREE] = FldEff_UseCutOnTree, + [FLDEFF_SHADOW] = FldEff_Shadow, + [FLDEFF_TALL_GRASS] = FldEff_TallGrass, + [FLDEFF_RIPPLE] = FldEff_Ripple, + [FLDEFF_FIELD_MOVE_SHOW_MON] = FldEff_FieldMoveShowMon, + [FLDEFF_ASH] = FldEff_Ash, + [FLDEFF_SURF_BLOB] = FldEff_SurfBlob, + [FLDEFF_USE_SURF] = FldEff_UseSurf, + [FLDEFF_DUST] = FldEff_Dust, + [FLDEFF_USE_SECRET_POWER_CAVE] = FldEff_Nop, + [FLDEFF_JUMP_TALL_GRASS] = FldEff_JumpTallGrass, + [FLDEFF_SAND_FOOTPRINTS] = FldEff_SandFootprints, + [FLDEFF_JUMP_BIG_SPLASH] = FldEff_JumpBigSplash, + [FLDEFF_SPLASH] = FldEff_Splash, + [FLDEFF_JUMP_SMALL_SPLASH] = FldEff_JumpSmallSplash, + [FLDEFF_LONG_GRASS] = FldEff_LongGrass, + [FLDEFF_JUMP_LONG_GRASS] = FldEff_JumpLongGrass, + [FLDEFF_UNUSED_GRASS] = FldEff_UnusedGrass, + [FLDEFF_UNUSED_GRASS_2] = FldEff_UnusedGrass2, + [FLDEFF_UNUSED_SAND] = FldEff_UnusedSand, + [FLDEFF_UNUSED_WATER_SURFACING] = FldEff_UnusedWaterSurfacing, + [FLDEFF_BERRY_TREE_GROWTH_SPARKLE] = FldEff_BerryTreeGrowthSparkle, + [FLDEFF_DEEP_SAND_FOOTPRINTS] = FldEff_DeepSandFootprints, + [FLDEFF_POKECENTER_HEAL] = FldEff_PokecenterHeal, + [FLDEFF_USE_SECRET_POWER_TREE] = FldEff_Nop, + [FLDEFF_USE_SECRET_POWER_SHRUB] = FldEff_Nop, + [FLDEFF_TREE_DISGUISE] = FldEff_TreeDisguise, + [FLDEFF_MOUNTAIN_DISGUISE] = FldEff_MountainDisguise, + [FLDEFF_NPCFLY_OUT] = FldEff_NpcFlyOut, + [FLDEFF_FLY_OUT] = FldEff_FlyOut, + [FLDEFF_FLY_IN] = FldEff_FlyIn, + [FLDEFF_QUESTION_MARK_ICON_AND_EMOTE] = FldEff_QuestionMarkIcon, + [FLDEFF_FEET_IN_FLOWING_WATER] = FldEff_FeetInFlowingWater, + [FLDEFF_BIKE_TIRE_TRACKS] = FldEff_BikeTireTracks, + [FLDEFF_SAND_DISGUISE] = FldEff_SandDisguise, + [FLDEFF_USE_ROCK_SMASH] = FldEff_UseRockSmash, + [FLDEFF_USE_DIG] = FldEff_UseDig, + [FLDEFF_SAND_PILE] = FldEff_SandPile, + [FLDEFF_USE_STRENGTH] = FldEff_UseStrength, + [FLDEFF_SHORT_GRASS] = FldEff_ShortGrass, + [FLDEFF_HOT_SPRINGS_WATER] = FldEff_HotSpringsWater, + [FLDEFF_USE_WATERFALL] = FldEff_UseWaterfall, + [FLDEFF_USE_DIVE] = FldEff_UseDive, + [FLDEFF_POKEBALL] = FldEff_Pokeball, + [FLDEFF_X_ICON] = FldEff_XIcon, + [FLDEFF_NOP_47] = FldEff_Nop, + [FLDEFF_NOP_48] = FldEff_Nop, + [FLDEFF_POP_OUT_OF_ASH] = FldEff_PopOutOfAsh, + [FLDEFF_LAVARIDGE_GYM_WARP] = FldEff_LavaridgeGymWarp, + [FLDEFF_SWEET_SCENT] = FldEff_SweetScent, + [FLDEFF_SAND_PILLAR] = FldEff_Nop, + [FLDEFF_BUBBLES] = FldEff_Bubbles, + [FLDEFF_SPARKLE] = FldEff_Sparkle, + [FLDEFF_SECRET_POWER_CAVE] = FldEff_Nop, + [FLDEFF_SECRET_POWER_TREE] = FldEff_Nop, + [FLDEFF_SECRET_POWER_SHRUB] = FldEff_Nop, + [FLDEFF_CUT_GRASS] = FldEff_CutGrass, + [FLDEFF_FIELD_MOVE_SHOW_MON_INIT] = FldEff_FieldMoveShowMonInit, + [FLDEFF_USE_FLY_ANCIENT_TOMB] = FldEff_Nop, + [FLDEFF_PCTURN_ON] = FldEff_Nop, + [FLDEFF_HALL_OF_FAME_RECORD] = FldEff_HallOfFameRecord, + [FLDEFF_USE_TELEPORT] = FldEff_UseTeleport, + [FLDEFF_SMILEY_FACE_ICON] = FldEff_SmileyFaceIcon, + [FLDEFF_USE_VS_SEEKER] = FldEff_UseVsSeeker, + [FLDEFF_DOUBLE_EXCL_MARK_ICON] = FldEff_DoubleExclMarkIcon, + [FLDEFF_MOVE_DEOXYS_ROCK] = FldEff_MoveDeoxysRock, + [FLDEFF_DESTROY_DEOXYS_ROCK] = FldEff_DestroyDeoxysRock, + [FLDEFF_PHOTO_FLASH] = FldEff_PhotoFlash, + [FLDEFF_TRACKS_SLITHER] = FldEff_TracksSlither, + [FLDEFF_TRACKS_BUG] = FldEff_TracksBug, + [FLDEFF_TRACKS_SPOT] = FldEff_TracksSpot, + [FLDEFF_SNOW_FOOTPRINTS] = FldEff_SnowFootprints, }; static const struct OamData sNewGameOakOamAttributes = { @@ -2542,14 +2542,25 @@ u32 FldEff_FieldMoveShowMon(void) return 0; } +#define SHOW_MON_CRY_NO_DUCKING (1 << 31) + u32 FldEff_FieldMoveShowMonInit(void) { - u32 r6 = gFieldEffectArguments[0] & 0x80000000; + u32 noDucking = gFieldEffectArguments[0] & SHOW_MON_CRY_NO_DUCKING; u8 partyIdx = gFieldEffectArguments[0]; - gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); - gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_SHINY, NULL); - gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); - gFieldEffectArguments[0] |= r6; + if (gFieldEffectArguments[0] & NOT_IN_PARTY_MASK) + { + gFieldEffectArguments[0] &= ~NOT_IN_PARTY_MASK; + gFieldEffectArguments[1] = FALSE; + gFieldEffectArguments[2] = SHINY_ODDS; + } + else + { + gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); + gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_SHINY, NULL); + gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); + } + gFieldEffectArguments[0] |= noDucking; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); return 0; @@ -2872,9 +2883,9 @@ static u8 InitFieldMoveMonSprite(u32 species, bool32 isShiny, u32 personality) bool16 playCry; u8 monSprite; struct Sprite *sprite; - playCry = (species & 0x80000000) >> 16; - species &= 0x7fffffff; - monSprite = CreateMonSprite_FieldMove(species, isShiny, personality, 0x140, 0x50, 0); + playCry = (species & SHOW_MON_CRY_NO_DUCKING) >> 16; + species &= ~SHOW_MON_CRY_NO_DUCKING; + monSprite = CreateMonSprite_FieldMove(species, isShiny, personality, 320, 80, 0); sprite = &gSprites[monSprite]; sprite->callback = SpriteCallbackDummy; sprite->oam.priority = 0; @@ -2982,7 +2993,7 @@ static void UseSurfEffect_3(struct Task *task) objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventCheckHeldMovementStatus(objectEvent)) { - gFieldEffectArguments[0] = task->data[15] | 0x80000000; + gFieldEffectArguments[0] = task->data[15] | SHOW_MON_CRY_NO_DUCKING; FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); task->data[0]++; } diff --git a/src/field_moves.c b/src/field_move.c similarity index 77% rename from src/field_moves.c rename to src/field_move.c index daa7110d5..1d2b92e08 100644 --- a/src/field_moves.c +++ b/src/field_move.c @@ -1,9 +1,9 @@ #include "global.h" #include "event_data.h" -#include "field_moves.h" +#include "field_move.h" #include "fldeff.h" #include "pokemon.h" -#include "constants/field_moves.h" +#include "constants/field_move.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -14,11 +14,6 @@ static bool32 FieldMoveUnlocked_Strength(void); static bool32 FieldMoveUnlocked_Flash(void); static bool32 FieldMoveUnlocked_RockSmash(void); static bool32 FieldMoveUnlocked_Waterfall(void); -static bool32 FieldMoveUnlocked_Teleport(void); -static bool32 FieldMoveUnlocked_Dig(void); -static bool32 FieldMoveUnlocked_MilkDrink(void); -static bool32 FieldMoveUnlocked_SoftBoiled(void); -static bool32 FieldMoveUnlocked_SweetScent(void); static const u8 sText_ShareHp[] = _("Share HP."); @@ -94,10 +89,50 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = .fieldMoveFunc = SetUpFieldMove_Waterfall, .questLogText = COMPOUND_STRING("{STR_VAR_1} used the Hidden Move\nWATERFALL to scale a raging torrent."), }, + [FIELD_MOVE_WHIRLPOOL] = + { + .defaultSpecies = SPECIES_SHELLDER, + .isUnlockedFunc = NULL, + .moveId = MOVE_NONE, + .partyMessageId = PARTY_MSG_CANT_USE_HERE, + .description = COMPOUND_STRING("N/A"), + .fieldMoveFunc = NULL, + .questLogText = COMPOUND_STRING("N/A"), + }, + [FIELD_MOVE_DIVE] = + { + .defaultSpecies = SPECIES_SEEL, + .isUnlockedFunc = NULL, + .moveId = MOVE_NONE, + .partyMessageId = PARTY_MSG_CANT_USE_HERE, + .description = COMPOUND_STRING("N/A"), + .fieldMoveFunc = NULL, + .questLogText = COMPOUND_STRING("N/A"), + }, + [FIELD_MOVE_DEFOG] = + { + .defaultSpecies = SPECIES_BUTTERFREE, + .isUnlockedFunc = NULL, + .moveId = MOVE_NONE, + .partyMessageId = PARTY_MSG_CANT_USE_HERE, + .description = COMPOUND_STRING("N/A"), + .fieldMoveFunc = NULL, + .questLogText = COMPOUND_STRING("N/A"), + }, + [FIELD_MOVE_ROCK_CLIMB] = + { + .defaultSpecies = SPECIES_SANDSHREW, + .isUnlockedFunc = NULL, + .moveId = MOVE_NONE, + .partyMessageId = PARTY_MSG_CANT_USE_HERE, + .description = COMPOUND_STRING("N/A"), + .fieldMoveFunc = NULL, + .questLogText = COMPOUND_STRING("N/A"), + }, [FIELD_MOVE_TELEPORT] = { .defaultSpecies = SPECIES_ABRA, - .isUnlockedFunc = FieldMoveUnlocked_Teleport, + .isUnlockedFunc = NULL, .moveId = MOVE_TELEPORT, .partyMessageId = PARTY_MSG_CANT_USE_HERE, .description = COMPOUND_STRING("Return to a healing spot."), @@ -107,7 +142,7 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = [FIELD_MOVE_DIG] = { .defaultSpecies = SPECIES_DIGLETT, - .isUnlockedFunc = FieldMoveUnlocked_Dig, + .isUnlockedFunc = NULL, .moveId = MOVE_DIG, .partyMessageId = PARTY_MSG_CANT_USE_HERE, .description = COMPOUND_STRING("Escape from here."), @@ -117,7 +152,7 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = [FIELD_MOVE_MILK_DRINK] = { .defaultSpecies = SPECIES_MILTANK, - .isUnlockedFunc = FieldMoveUnlocked_MilkDrink, + .isUnlockedFunc = NULL, .moveId = MOVE_MILK_DRINK, .partyMessageId = PARTY_MSG_NOT_ENOUGH_HP, .description = sText_ShareHp, @@ -127,7 +162,7 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = [FIELD_MOVE_SOFT_BOILED] = { .defaultSpecies = SPECIES_CHANSEY, - .isUnlockedFunc = FieldMoveUnlocked_SoftBoiled, + .isUnlockedFunc = NULL, .moveId = MOVE_SOFT_BOILED, .partyMessageId = PARTY_MSG_NOT_ENOUGH_HP, .description = sText_ShareHp, @@ -137,7 +172,7 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = [FIELD_MOVE_SWEET_SCENT] = { .defaultSpecies = SPECIES_ODDISH, - .isUnlockedFunc = FieldMoveUnlocked_SweetScent, + .isUnlockedFunc = NULL, .moveId = MOVE_SWEET_SCENT, .partyMessageId = PARTY_MSG_CANT_USE_HERE, .description = COMPOUND_STRING("Lure wild POKéMON."), @@ -146,7 +181,7 @@ const struct FieldMoveInfo gFieldMovesInfo[FIELD_MOVE_COUNT] = }, }; -u16 FieldMove_GetDefaultSpecies(u32 fieldMove) +u16 FieldMove_GetDefaultSpecies(enum FieldMove fieldMove) { if (fieldMove >= FIELD_MOVE_COUNT) return SPECIES_NONE; @@ -154,6 +189,16 @@ u16 FieldMove_GetDefaultSpecies(u32 fieldMove) return SanitizeSpeciesId(gFieldMovesInfo[fieldMove].defaultSpecies); } +bool32 FieldMove_IsUnlocked(enum FieldMove fieldMove) +{ + if (fieldMove >= FIELD_MOVE_COUNT) + return FALSE; + if (gFieldMovesInfo[fieldMove].isUnlockedFunc == NULL) + return TRUE; + + return gFieldMovesInfo[fieldMove].isUnlockedFunc(); +} + static bool32 FieldMoveUnlocked_Cut(void) { return FlagGet(FLAG_BADGE02_GET); @@ -188,29 +233,3 @@ static bool32 FieldMoveUnlocked_Waterfall(void) { return FlagGet(FLAG_BADGE07_GET); } - -static bool32 FieldMoveUnlocked_Teleport(void) -{ - return TRUE; -} - -static bool32 FieldMoveUnlocked_Dig(void) -{ - return TRUE; -} - -static bool32 FieldMoveUnlocked_MilkDrink(void) -{ - return TRUE; -} - - -static bool32 FieldMoveUnlocked_SoftBoiled(void) -{ - return TRUE; -} - -static bool32 FieldMoveUnlocked_SweetScent(void) -{ - return TRUE; -} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 08cdd546d..06cc9cf02 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1142,23 +1142,6 @@ u8 GetPlayerAvatarGenderByGraphicsId(u16 graphicsId) } } -bool8 PartyHasMonWithSurf(void) -{ - u8 i; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) - break; - if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF)) - return TRUE; - } - } - return FALSE; -} - bool8 IsPlayerSurfingNorth(void) { if (GetPlayerMovementDirection() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index beb42596b..b66cd5c5c 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -35,7 +35,6 @@ u32 FldEff_UseStrength(void) { u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(ShowMonCB_UseStrength); - GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); return FALSE; } diff --git a/src/party_menu.c b/src/party_menu.c index f3d0f286c..2cb689541 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -13,7 +13,7 @@ #include "event_data.h" #include "evolution_scene.h" #include "field_effect.h" -#include "field_moves.h" +#include "field_move.h" #include "field_player_avatar.h" #include "field_fadetransition.h" #include "field_weather.h" @@ -64,7 +64,7 @@ #include "constants/battle.h" #include "constants/easy_chat.h" #include "constants/field_effects.h" -#include "constants/field_moves.h" +#include "constants/field_move.h" #include "constants/item_effects.h" #include "constants/item_menu.h" #include "constants/items.h" @@ -3109,9 +3109,12 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) // Add field moves to action list for (i = 0; i < MAX_MON_MOVES; ++i) { + u16 moveId = GetMonData(&mons[slotId], i + MON_DATA_MOVE1); + if (moveId == MOVE_NONE) + continue; for (j = 0; j < FIELD_MOVE_COUNT; ++j) { - if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == gFieldMovesInfo[j].moveId) + if (moveId == gFieldMovesInfo[j].moveId) { AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + CURSOR_OPTION_FIELD_MOVES); break; @@ -4068,7 +4071,7 @@ static void CursorCB_FieldMove(u8 taskId) } else { - if (!gFieldMovesInfo[fieldMove].isUnlockedFunc()) + if (gFieldMovesInfo[fieldMove].isUnlockedFunc != NULL && !gFieldMovesInfo[fieldMove].isUnlockedFunc()) { DisplayPartyMenuMessage(gText_CantUseUntilNewBadge, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; @@ -4209,7 +4212,7 @@ bool32 SetUpFieldMove_Surf(void) GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) != TRUE - && PartyHasMonWithSurf() == TRUE + && !TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && IsPlayerFacingSurfableFishableWater() == TRUE) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; @@ -7678,3 +7681,17 @@ static void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom) SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } +u32 Party_FirstMonWithMove(u16 moveId) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) + break; + if (MonKnowsMove(&gPlayerParty[i], moveId)) + return i; + } + return PARTY_SIZE; +} + diff --git a/src/quest_log_events.c b/src/quest_log_events.c index 1e4e5d167..5d6112792 100644 --- a/src/quest_log_events.c +++ b/src/quest_log_events.c @@ -5,7 +5,7 @@ #include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "event_scripts.h" -#include "field_moves.h" +#include "field_move.h" #include "menu_helpers.h" #include "item.h" #include "link.h" @@ -14,7 +14,7 @@ #include "pokemon_storage_system.h" #include "region_map.h" #include "strings.h" -#include "constants/field_moves.h" +#include "constants/field_move.h" #include "constants/maps.h" #include "constants/trainers.h" #include "constants/items.h" diff --git a/src/scrcmd.c b/src/scrcmd.c index 59528e416..660297e7c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -14,6 +14,7 @@ #include "quest_log.h" #include "map_preview_screen.h" #include "fieldmap.h" +#include "field_move.h" #include "field_weather.h" #include "field_tasks.h" #include "field_fadetransition.h" @@ -40,6 +41,7 @@ #include "field_door.h" #include "constants/event_objects.h" #include "constants/event_object_movement.h" +#include "constants/field_move.h" #include "constants/maps.h" #include "constants/sound.h" @@ -1824,6 +1826,41 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext * ctx) return FALSE; } +bool8 ScrCmd_checkfieldmoveusable(struct ScriptContext* ctx) +{ + u32 partyIndex; + enum FieldMove fieldMove = ScriptReadHalfword(ctx); + u16 moveId = gFieldMovesInfo[fieldMove].moveId; + u16 species = SPECIES_NONE; + gSpecialVar_Result = FALSE; + + if (!FieldMove_IsUnlocked(fieldMove)) + return FALSE; + + partyIndex = Party_FirstMonWithMove(moveId); + if (partyIndex != PARTY_SIZE) + { + gFieldEffectArguments[0] = partyIndex; + gSpecialVar_0x8004 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + gSpecialVar_Result = TRUE; + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, gStringVar1); + StringGet_Nickname(gStringVar1); + StringCopy(gStringVar2, gMovesInfo[moveId].name); + } + else if (OW_FIELD_MOVES_WITHOUT_HMS) + { + species = FieldMove_GetDefaultSpecies(fieldMove); + gFieldEffectArguments[0] = species | NOT_IN_PARTY_MASK; + gSpecialVar_0x8004 = species; + gSpecialVar_Result = TRUE; + StringCopy(gStringVar1, COMPOUND_STRING("PROF. OAK's ")); + StringAppend(gStringVar1, gSpeciesInfo[species].speciesName); + StringCopy(gStringVar2, gMovesInfo[moveId].name); + } + + return FALSE; +} + bool8 ScrCmd_addmoney(struct ScriptContext * ctx) { u32 amount = ScriptReadWord(ctx); diff --git a/src/trainer_see.c b/src/trainer_see.c index 8b37fb0be..33397119c 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -946,7 +946,7 @@ u32 FldEff_QuestionMarkIcon(void) spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emote, 0, 0, 0x52); if (spriteId == MAX_SPRITES) return 0; - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EMOTE, emotion); // Set animation based on emotion + SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON_AND_EMOTE, emotion); // Set animation based on emotion UpdateSpritePaletteByTemplate(&sSpriteTemplate_Emote, &gSprites[spriteId]); return 0; } @@ -954,7 +954,7 @@ u32 FldEff_QuestionMarkIcon(void) if (spriteId != MAX_SPRITES) { - SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 4); + SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON_AND_EMOTE, 4); UpdateSpritePaletteByTemplate(&sSpriteTemplate_Emoticons, &gSprites[spriteId]); }