config for hm-less field moves, more field move/effect refactoring

This commit is contained in:
cawtds
2024-11-12 17:50:44 +01:00
parent 2b5308d9c4
commit c6bdd950e0
23 changed files with 367 additions and 285 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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]++;
}

View File

@@ -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;
}

View File

@@ -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))

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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"

View File

@@ -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);

View File

@@ -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]);
}