mirror of
https://github.com/pret/pokefirered.git
synced 2026-09-28 03:49:31 -05:00
config for hm-less field moves, more field move/effect refactoring
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
25
include/constants/field_move.h
Normal file
25
include/constants/field_move.h
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]++;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
37
src/scrcmd.c
37
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);
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user