mirror of
https://github.com/rh-hideout/pokeemerald-expansion
synced 2025-10-06 02:22:55 +02:00
Rock climb by ghoulslash (#7432)
Co-authored-by: Evan <eroelke@gmail.com> Co-authored-by: Jaizu <jaizu85@gmail.com> Co-authored-by: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Co-authored-by: ghoulslash <pokevoyager0@gmail.com> Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
@@ -81,6 +81,8 @@ gFieldEffectScriptPointers::
|
|||||||
.4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT
|
.4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT
|
||||||
.4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST
|
.4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST
|
||||||
.4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG
|
.4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG
|
||||||
|
.4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB
|
||||||
|
.4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST
|
||||||
|
|
||||||
gFieldEffectScript_ExclamationMarkIcon1::
|
gFieldEffectScript_ExclamationMarkIcon1::
|
||||||
field_eff_callnative FldEff_ExclamationMarkIcon
|
field_eff_callnative FldEff_ExclamationMarkIcon
|
||||||
@@ -384,3 +386,11 @@ gFieldEffectScript_CaveDust::
|
|||||||
gFieldEffectScript_Defog::
|
gFieldEffectScript_Defog::
|
||||||
field_eff_callnative FldEff_Defog
|
field_eff_callnative FldEff_Defog
|
||||||
field_eff_end
|
field_eff_end
|
||||||
|
gFieldEffectScript_UseRockClimb:: @ 82DBC3F
|
||||||
|
field_eff_callnative FldEff_UseRockClimb
|
||||||
|
field_eff_end
|
||||||
|
|
||||||
|
gFieldEffectScript_RockClimbDust:: @ 82DBB28
|
||||||
|
field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust
|
||||||
|
field_eff_end
|
||||||
|
|
||||||
|
@@ -441,3 +441,36 @@ EventScript_UseDefog::
|
|||||||
waitstate
|
waitstate
|
||||||
releaseall
|
releaseall
|
||||||
end
|
end
|
||||||
|
|
||||||
|
EventScript_UseRockClimb::
|
||||||
|
lockall
|
||||||
|
checkfieldmove FIELD_MOVE_ROCK_CLIMB
|
||||||
|
goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantRockClimb
|
||||||
|
bufferpartymonnick STR_VAR_1, VAR_RESULT
|
||||||
|
setfieldeffectargument 0, VAR_RESULT
|
||||||
|
msgbox Text_WantToRockClimb, MSGBOX_YESNO
|
||||||
|
goto_if_eq VAR_RESULT, NO, EventScript_EndRockClimb
|
||||||
|
msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT
|
||||||
|
closemessage
|
||||||
|
dofieldeffect FLDEFF_USE_ROCK_CLIMB
|
||||||
|
waitstate
|
||||||
|
goto EventScript_EndRockClimb
|
||||||
|
end
|
||||||
|
|
||||||
|
EventScript_CantRockClimb::
|
||||||
|
msgbox Text_CantRockClimb, MSGBOX_DEFAULT
|
||||||
|
|
||||||
|
EventScript_EndRockClimb::
|
||||||
|
releaseall
|
||||||
|
end
|
||||||
|
|
||||||
|
Text_WantToRockClimb:
|
||||||
|
.string "The cliff is steep.\n"
|
||||||
|
.string "Would you like to use Rock Climb?$"
|
||||||
|
|
||||||
|
Text_MonUsedRockClimb:
|
||||||
|
.string "{STR_VAR_1} used Rock Climb!$"
|
||||||
|
|
||||||
|
Text_CantRockClimb:
|
||||||
|
.string "The cliff is steep.\n"
|
||||||
|
.string "A Pokémon may be able to climb it.$"
|
||||||
|
19
graphics/field_effects/palettes/big_dust.pal
Normal file
19
graphics/field_effects/palettes/big_dust.pal
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
JASC-PAL
|
||||||
|
0100
|
||||||
|
16
|
||||||
|
98 172 238
|
||||||
|
198 181 156
|
||||||
|
165 140 115
|
||||||
|
181 165 140
|
||||||
|
148 123 99
|
||||||
|
206 198 173
|
||||||
|
189 173 148
|
||||||
|
82 74 57
|
||||||
|
222 180 148
|
||||||
|
140 123 82
|
||||||
|
173 156 123
|
||||||
|
238 213 180
|
||||||
|
0 0 0
|
||||||
|
0 0 0
|
||||||
|
0 0 0
|
||||||
|
0 0 0
|
BIN
graphics/field_effects/pics/rock_climb_blob.png
Normal file
BIN
graphics/field_effects/pics/rock_climb_blob.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 383 B |
BIN
graphics/field_effects/pics/rock_climb_dust.png
Normal file
BIN
graphics/field_effects/pics/rock_climb_dust.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 558 B |
@@ -11,6 +11,7 @@
|
|||||||
#define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last.
|
#define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last.
|
||||||
#define OW_WHITEOUT_CUTSCENE GEN_LATEST // In Gen4+, whiting out shows an additional message and post whiteout event script cutscene with a healing NPC. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.)
|
#define OW_WHITEOUT_CUTSCENE GEN_LATEST // In Gen4+, whiting out shows an additional message and post whiteout event script cutscene with a healing NPC. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.)
|
||||||
#define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt.
|
#define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt.
|
||||||
|
#define OW_ROCK_CLIMB_FIELD_MOVE FALSE // If enabled, Rock Climb can be used as a Field Move as seen in DPPt.
|
||||||
|
|
||||||
// Item Obtain Description Box
|
// Item Obtain Description Box
|
||||||
#define OW_ITEM_DESCRIPTIONS_OFF 0 // never show descriptions
|
#define OW_ITEM_DESCRIPTIONS_OFF 0 // never show descriptions
|
||||||
|
@@ -259,6 +259,11 @@
|
|||||||
#define MOVEMENT_ACTION_SURF_STILL_UP 0xAB
|
#define MOVEMENT_ACTION_SURF_STILL_UP 0xAB
|
||||||
#define MOVEMENT_ACTION_SURF_STILL_LEFT 0xAC
|
#define MOVEMENT_ACTION_SURF_STILL_LEFT 0xAC
|
||||||
#define MOVEMENT_ACTION_SURF_STILL_RIGHT 0xAD
|
#define MOVEMENT_ACTION_SURF_STILL_RIGHT 0xAD
|
||||||
|
//fast diagonal movement
|
||||||
|
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT 0xAE
|
||||||
|
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT 0xAF
|
||||||
|
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT 0xB0
|
||||||
|
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT 0xB1
|
||||||
|
|
||||||
#define MOVEMENT_ACTION_STEP_END 0xFE
|
#define MOVEMENT_ACTION_STEP_END 0xFE
|
||||||
#define MOVEMENT_ACTION_NONE 0xFF
|
#define MOVEMENT_ACTION_NONE 0xFF
|
||||||
|
@@ -77,6 +77,8 @@
|
|||||||
#define FLDEFF_TRACKS_BUG 72
|
#define FLDEFF_TRACKS_BUG 72
|
||||||
#define FLDEFF_CAVE_DUST 73
|
#define FLDEFF_CAVE_DUST 73
|
||||||
#define FLDEFF_DEFOG 74
|
#define FLDEFF_DEFOG 74
|
||||||
|
#define FLDEFF_USE_ROCK_CLIMB 75
|
||||||
|
#define FLDEFF_ROCK_CLIMB_DUST 76
|
||||||
|
|
||||||
#define FLDEFFOBJ_SHADOW_S 0
|
#define FLDEFFOBJ_SHADOW_S 0
|
||||||
#define FLDEFFOBJ_SHADOW_M 1
|
#define FLDEFFOBJ_SHADOW_M 1
|
||||||
@@ -119,6 +121,8 @@
|
|||||||
#define FLDEFFOBJ_TRACKS_SPOT 38
|
#define FLDEFFOBJ_TRACKS_SPOT 38
|
||||||
#define FLDEFFOBJ_TRACKS_BUG 39
|
#define FLDEFFOBJ_TRACKS_BUG 39
|
||||||
#define FLDEFFOBJ_CAVE_DUST 40
|
#define FLDEFFOBJ_CAVE_DUST 40
|
||||||
|
#define FLDEFFOBJ_ROCK_CLIMB_BLOB 41
|
||||||
|
#define FLDEFFOBJ_ROCK_CLIMB_DUST 42
|
||||||
|
|
||||||
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
|
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
|
||||||
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
|
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
|
||||||
@@ -133,6 +137,7 @@
|
|||||||
#define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010
|
#define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010
|
||||||
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
|
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
|
||||||
#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012
|
#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012
|
||||||
|
#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1013
|
||||||
#define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400
|
#define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400
|
||||||
|
|
||||||
// tile tags, for field effects that may have many copies on screen at once
|
// tile tags, for field effects that may have many copies on screen at once
|
||||||
|
@@ -18,6 +18,9 @@ enum FieldMove
|
|||||||
FIELD_MOVE_MILK_DRINK,
|
FIELD_MOVE_MILK_DRINK,
|
||||||
FIELD_MOVE_SOFT_BOILED,
|
FIELD_MOVE_SOFT_BOILED,
|
||||||
FIELD_MOVE_SWEET_SCENT,
|
FIELD_MOVE_SWEET_SCENT,
|
||||||
|
#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE
|
||||||
|
FIELD_MOVE_ROCK_CLIMB,
|
||||||
|
#endif
|
||||||
#if OW_DEFOG_FIELD_MOVE == TRUE
|
#if OW_DEFOG_FIELD_MOVE == TRUE
|
||||||
FIELD_MOVE_DEFOG,
|
FIELD_MOVE_DEFOG,
|
||||||
#endif
|
#endif
|
||||||
|
@@ -241,7 +241,7 @@ enum {
|
|||||||
MB_UP_LEFT_STAIR_WARP,
|
MB_UP_LEFT_STAIR_WARP,
|
||||||
MB_DOWN_RIGHT_STAIR_WARP,
|
MB_DOWN_RIGHT_STAIR_WARP,
|
||||||
MB_DOWN_LEFT_STAIR_WARP,
|
MB_DOWN_LEFT_STAIR_WARP,
|
||||||
MB_UNUSED_EF,
|
MB_ROCK_CLIMB,
|
||||||
NUM_METATILE_BEHAVIORS
|
NUM_METATILE_BEHAVIORS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -573,6 +573,7 @@ extern const u8 EventScript_UseWaterfall[];
|
|||||||
extern const u8 EventScript_CannotUseWaterfall[];
|
extern const u8 EventScript_CannotUseWaterfall[];
|
||||||
extern const u8 EventScript_UseDive[];
|
extern const u8 EventScript_UseDive[];
|
||||||
extern const u8 EventScript_UseDiveUnderwater[];
|
extern const u8 EventScript_UseDiveUnderwater[];
|
||||||
|
extern const u8 EventScript_UseRockClimb[];
|
||||||
extern const u8 EventScript_FallDownHole[];
|
extern const u8 EventScript_FallDownHole[];
|
||||||
extern const u8 EventScript_FieldPoison[];
|
extern const u8 EventScript_FieldPoison[];
|
||||||
extern const u8 EventScript_EggHatch[];
|
extern const u8 EventScript_EggHatch[];
|
||||||
|
@@ -49,5 +49,5 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId);
|
|||||||
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority);
|
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority);
|
||||||
void StartEscapeRopeFieldEffect(void);
|
void StartEscapeRopeFieldEffect(void);
|
||||||
void FieldEffectFreeGraphicsResources(struct Sprite *sprite);
|
void FieldEffectFreeGraphicsResources(struct Sprite *sprite);
|
||||||
|
bool8 IsRockClimbActive(void);
|
||||||
#endif // GUARD_FIELD_EFFECTS_H
|
#endif // GUARD_FIELD_EFFECTS_H
|
||||||
|
@@ -164,5 +164,6 @@ bool8 MetatileBehavior_IsSidewaysStairsRightSideBottom(u8 metatileBehavior);
|
|||||||
bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior);
|
bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior);
|
||||||
bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior);
|
bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior);
|
||||||
bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior);
|
bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior);
|
||||||
|
bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior);
|
||||||
|
|
||||||
#endif // GUARD_METATILE_BEHAVIOR_H
|
#endif // GUARD_METATILE_BEHAVIOR_H
|
||||||
|
@@ -110,5 +110,6 @@ bool32 SetUpFieldMove_Surf(void);
|
|||||||
bool32 SetUpFieldMove_Fly(void);
|
bool32 SetUpFieldMove_Fly(void);
|
||||||
bool32 SetUpFieldMove_Waterfall(void);
|
bool32 SetUpFieldMove_Waterfall(void);
|
||||||
bool32 SetUpFieldMove_Dive(void);
|
bool32 SetUpFieldMove_Dive(void);
|
||||||
|
bool32 SetUpFieldMove_RockClimb(void);
|
||||||
|
|
||||||
#endif // GUARD_PARTY_MENU_H
|
#endif // GUARD_PARTY_MENU_H
|
||||||
|
@@ -663,6 +663,9 @@ $(FLDEFFGFXDIR)/deep_sand_footprints.4bpp: %.4bpp: %.png
|
|||||||
$(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 2 -mheight 1
|
$(GFX) $< $@ -mwidth 2 -mheight 1
|
||||||
|
|
||||||
|
$(FLDEFFGFXDIR)/rock_climb_dust.4bpp: %.4bpp: %.png
|
||||||
|
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||||
|
|
||||||
$(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 2 -mheight 2
|
$(GFX) $< $@ -mwidth 2 -mheight 2
|
||||||
|
|
||||||
@@ -687,6 +690,9 @@ $(FLDEFFGFXDIR)/short_grass.4bpp: %.4bpp: %.png
|
|||||||
$(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||||
|
|
||||||
|
$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png
|
||||||
|
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||||
|
|
||||||
$(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png
|
$(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png
|
||||||
$(GFX) $< $@ -mwidth 2 -mheight 2
|
$(GFX) $< $@ -mwidth 2 -mheight 2
|
||||||
|
|
||||||
|
@@ -40,6 +40,8 @@ extern const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks;
|
|||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks;
|
||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks;
|
||||||
extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust;
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust;
|
||||||
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob;
|
||||||
|
extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust;
|
||||||
|
|
||||||
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
||||||
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
|
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
|
||||||
@@ -83,4 +85,6 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
|||||||
[FLDEFFOBJ_TRACKS_SPOT] = &gFieldEffectObjectTemplate_SpotTracks,
|
[FLDEFFOBJ_TRACKS_SPOT] = &gFieldEffectObjectTemplate_SpotTracks,
|
||||||
[FLDEFFOBJ_TRACKS_BUG] = &gFieldEffectObjectTemplate_BugTracks,
|
[FLDEFFOBJ_TRACKS_BUG] = &gFieldEffectObjectTemplate_BugTracks,
|
||||||
[FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust,
|
[FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust,
|
||||||
|
[FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob,
|
||||||
|
[FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust,
|
||||||
};
|
};
|
||||||
|
@@ -1404,3 +1404,47 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST};
|
const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST};
|
||||||
|
static const struct SpriteFrameImage sPicTable_RockClimbBlob[] = {
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 1),
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 0),
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob = {
|
||||||
|
.tileTag = 0xFFFF,
|
||||||
|
.paletteTag = 0xFFFF,
|
||||||
|
.oam = &gObjectEventBaseOam_32x32,
|
||||||
|
.anims = sAnimTable_SurfBlob,
|
||||||
|
.images = sPicTable_RockClimbBlob,
|
||||||
|
.affineAnims = gDummySpriteAffineAnimTable,
|
||||||
|
.callback = UpdateSurfBlobFieldEffect,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const union AnimCmd sAnim_RockClimbDust[] =
|
||||||
|
{
|
||||||
|
ANIMCMD_FRAME(0, 12),
|
||||||
|
ANIMCMD_FRAME(1, 12),
|
||||||
|
ANIMCMD_FRAME(2, 12),
|
||||||
|
ANIMCMD_END,
|
||||||
|
};
|
||||||
|
static const union AnimCmd *const sAnimTable_RockClimbDust[] =
|
||||||
|
{
|
||||||
|
sAnim_RockClimbDust,
|
||||||
|
};
|
||||||
|
static const struct SpriteFrameImage sPicTable_RockClimbDust[] = {
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 0),
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 1),
|
||||||
|
overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 2),
|
||||||
|
};
|
||||||
|
const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust = {
|
||||||
|
.tileTag = 0xFFFF,
|
||||||
|
.paletteTag = FLDEFF_PAL_TAG_DUST_CLOUD,
|
||||||
|
.oam = &gObjectEventBaseOam_32x32,
|
||||||
|
.anims = sAnimTable_RockClimbDust,
|
||||||
|
.images = sPicTable_RockClimbDust,
|
||||||
|
.affineAnims = gDummySpriteAffineAnimTable,
|
||||||
|
.callback = UpdateJumpImpactEffect,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct SpritePalette gSpritePalette_BigDust = {gFieldEffectPal_DustCloud, FLDEFF_PAL_TAG_DUST_CLOUD};
|
||||||
|
@@ -287,6 +287,12 @@ u8 MovementAction_SurfStillLeft_Step0(struct ObjectEvent *objectEvent, struct Sp
|
|||||||
u8 MovementAction_SurfStillLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
u8 MovementAction_SurfStillLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
||||||
u8 MovementAction_SurfStillRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
u8 MovementAction_SurfStillRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
||||||
u8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
u8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite);
|
||||||
|
//fast diagonal
|
||||||
|
u8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *, struct Sprite *);
|
||||||
|
|
||||||
|
|
||||||
u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *);
|
u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *);
|
||||||
@@ -463,6 +469,12 @@ u8 (*const gMovementActionFuncs_SurfStillDown[])(struct ObjectEvent *, struct Sp
|
|||||||
u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *);
|
u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *);
|
||||||
u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *);
|
u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *);
|
||||||
u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *);
|
u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *);
|
||||||
|
//fast diagonal
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *);
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *);
|
||||||
|
|
||||||
|
|
||||||
u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = {
|
u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
[MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown,
|
[MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown,
|
||||||
@@ -639,6 +651,12 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *)
|
|||||||
[MOVEMENT_ACTION_SURF_STILL_UP] = gMovementActionFuncs_SurfStillUp,
|
[MOVEMENT_ACTION_SURF_STILL_UP] = gMovementActionFuncs_SurfStillUp,
|
||||||
[MOVEMENT_ACTION_SURF_STILL_LEFT] = gMovementActionFuncs_SurfStillLeft,
|
[MOVEMENT_ACTION_SURF_STILL_LEFT] = gMovementActionFuncs_SurfStillLeft,
|
||||||
[MOVEMENT_ACTION_SURF_STILL_RIGHT] = gMovementActionFuncs_SurfStillRight,
|
[MOVEMENT_ACTION_SURF_STILL_RIGHT] = gMovementActionFuncs_SurfStillRight,
|
||||||
|
//fast diagonal
|
||||||
|
[MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT] = gMovementActionFuncs_WalkFastDiagonalUpLeft,
|
||||||
|
[MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT] = gMovementActionFuncs_WalkFastDiagonalUpRight,
|
||||||
|
[MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT] = gMovementActionFuncs_WalkFastDiagonalDownLeft,
|
||||||
|
[MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT] = gMovementActionFuncs_WalkFastDiagonalDownRight,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = {
|
u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
@@ -1676,3 +1694,28 @@ u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct S
|
|||||||
MovementAction_SurfStillRight_Step1,
|
MovementAction_SurfStillRight_Step1,
|
||||||
MovementAction_PauseSpriteAnim,
|
MovementAction_PauseSpriteAnim,
|
||||||
};
|
};
|
||||||
|
// fast diagonal
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
|
MovementAction_WalkFastDiagonalUpLeft_Step0,
|
||||||
|
MovementAction_WalkFastDiagonal_Step1,
|
||||||
|
MovementAction_PauseSpriteAnim,
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
|
MovementAction_WalkFastDiagonalUpRight_Step0,
|
||||||
|
MovementAction_WalkFastDiagonal_Step1,
|
||||||
|
MovementAction_PauseSpriteAnim,
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
|
MovementAction_WalkFastDiagonalDownLeft_Step0,
|
||||||
|
MovementAction_WalkFastDiagonal_Step1,
|
||||||
|
MovementAction_PauseSpriteAnim,
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = {
|
||||||
|
MovementAction_WalkFastDiagonalDownRight_Step0,
|
||||||
|
MovementAction_WalkFastDiagonal_Step1,
|
||||||
|
MovementAction_PauseSpriteAnim,
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -286,6 +286,8 @@ const u32 gObjectEventPic_CustapBerryTree[] = INCBIN_U32("graphics/object_events
|
|||||||
const u32 gObjectEventPic_JabocaBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/jaboca.4bpp");
|
const u32 gObjectEventPic_JabocaBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/jaboca.4bpp");
|
||||||
const u32 gObjectEventPic_RowapBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/rowap.4bpp");
|
const u32 gObjectEventPic_RowapBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/rowap.4bpp");
|
||||||
const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/field_effects/pics/surf_blob.4bpp");
|
const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/field_effects/pics/surf_blob.4bpp");
|
||||||
|
const u32 gFieldEffectObjectPic_RockClimbBlob[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_blob.4bpp");
|
||||||
|
const u32 gFieldEffectObjectPic_RockClimbDust[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_dust.4bpp");
|
||||||
const u32 gObjectEventPic_QuintyPlump[] = INCBIN_U32("graphics/object_events/pics/people/quinty_plump.4bpp");
|
const u32 gObjectEventPic_QuintyPlump[] = INCBIN_U32("graphics/object_events/pics/people/quinty_plump.4bpp");
|
||||||
const u16 gObjectEventPal_QuintyPlump[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump.gbapal");
|
const u16 gObjectEventPal_QuintyPlump[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump.gbapal");
|
||||||
const u16 gObjectEventPal_QuintyPlumpReflection[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump_reflection.gbapal");
|
const u16 gObjectEventPal_QuintyPlumpReflection[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump_reflection.gbapal");
|
||||||
@@ -330,6 +332,7 @@ const u32 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U32("graphics/field_
|
|||||||
const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/field_effects/pics/sand_disguise_placeholder.4bpp");
|
const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/field_effects/pics/sand_disguise_placeholder.4bpp");
|
||||||
const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effects/pics/hot_springs_water.4bpp");
|
const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effects/pics/hot_springs_water.4bpp");
|
||||||
const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal");
|
const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal");
|
||||||
|
const u16 gFieldEffectPal_DustCloud[] = INCBIN_U16("graphics/field_effects/palettes/big_dust.gbapal");
|
||||||
const u32 gFieldEffectObjectPic_AshPuff[] = INCBIN_U32("graphics/field_effects/pics/ash_puff.4bpp");
|
const u32 gFieldEffectObjectPic_AshPuff[] = INCBIN_U32("graphics/field_effects/pics/ash_puff.4bpp");
|
||||||
const u32 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp");
|
const u32 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp");
|
||||||
const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp");
|
const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp");
|
||||||
|
@@ -820,10 +820,10 @@ static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto sur
|
|||||||
[DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH,
|
[DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH,
|
||||||
[DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST,
|
[DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST,
|
||||||
[DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST,
|
[DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST,
|
||||||
[DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH,
|
[DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST,
|
||||||
[DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH,
|
[DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST,
|
||||||
[DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH,
|
[DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST,
|
||||||
[DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH,
|
[DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST,
|
||||||
};
|
};
|
||||||
static const u8 sAcroWheelieDirectionAnimNums[] = {
|
static const u8 sAcroWheelieDirectionAnimNums[] = {
|
||||||
[DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,
|
[DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH,
|
||||||
@@ -1068,6 +1068,10 @@ const u8 gJumpSpecialMovementActions[] = {
|
|||||||
MOVEMENT_ACTION_JUMP_SPECIAL_UP,
|
MOVEMENT_ACTION_JUMP_SPECIAL_UP,
|
||||||
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
|
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
|
||||||
MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,
|
MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,
|
||||||
|
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
|
||||||
|
MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,
|
||||||
|
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
|
||||||
|
MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,
|
||||||
};
|
};
|
||||||
const u8 gWalkInPlaceSlowMovementActions[] = {
|
const u8 gWalkInPlaceSlowMovementActions[] = {
|
||||||
[DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,
|
[DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,
|
||||||
@@ -11353,6 +11357,41 @@ bool8 MovementAction_WalkSlowStairsUp_Step1(struct ObjectEvent *objectEvent, str
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fast diagonal
|
||||||
|
bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, 1);
|
||||||
|
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, 1);
|
||||||
|
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, 1);
|
||||||
|
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, 1);
|
||||||
|
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
|
{
|
||||||
|
if (UpdateMovementNormal(objectEvent, sprite))
|
||||||
|
{
|
||||||
|
sprite->data[2] = 2;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
bool8 MovementAction_WalkSlowStairsDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
bool8 MovementAction_WalkSlowStairsDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||||
{
|
{
|
||||||
InitWalkSlow(objectEvent, sprite, DIR_SOUTH);
|
InitWalkSlow(objectEvent, sprite, DIR_SOUTH);
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include "field_control_avatar.h"
|
#include "field_control_avatar.h"
|
||||||
#include "field_message_box.h"
|
#include "field_message_box.h"
|
||||||
#include "field_move.h"
|
#include "field_move.h"
|
||||||
|
#include "field_effect.h"
|
||||||
#include "field_player_avatar.h"
|
#include "field_player_avatar.h"
|
||||||
#include "field_poison.h"
|
#include "field_poison.h"
|
||||||
#include "field_screen_effect.h"
|
#include "field_screen_effect.h"
|
||||||
@@ -521,6 +522,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me
|
|||||||
SetMsgSignPostAndVarFacing(direction);
|
SetMsgSignPostAndVarFacing(direction);
|
||||||
return Common_EventScript_ShowPokemonCenterSign;
|
return Common_EventScript_ShowPokemonCenterSign;
|
||||||
}
|
}
|
||||||
|
if (MetatileBehavior_IsRockClimbable(metatileBehavior) == TRUE && !IsRockClimbActive())
|
||||||
|
return EventScript_UseRockClimb;
|
||||||
|
|
||||||
elevation = position->elevation;
|
elevation = position->elevation;
|
||||||
if (elevation == MapGridGetElevationAt(position->x, position->y))
|
if (elevation == MapGridGetElevationAt(position->x, position->y))
|
||||||
|
@@ -245,6 +245,18 @@ static void UseVsSeeker_DoPlayerAnimation(struct Task *task);
|
|||||||
static void UseVsSeeker_ResetPlayerGraphics(struct Task *task);
|
static void UseVsSeeker_ResetPlayerGraphics(struct Task *task);
|
||||||
static void UseVsSeeker_CleanUpFieldEffect(struct Task *task);
|
static void UseVsSeeker_CleanUpFieldEffect(struct Task *task);
|
||||||
|
|
||||||
|
static void Task_UseRockClimb(u8);
|
||||||
|
static bool8 RockClimb_Init(struct Task *, struct ObjectEvent *);
|
||||||
|
static bool8 RockClimb_FieldMovePose(struct Task *, struct ObjectEvent *);
|
||||||
|
static bool8 RockClimb_ShowMon(struct Task *, struct ObjectEvent *);
|
||||||
|
static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent);
|
||||||
|
static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent);
|
||||||
|
static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent);
|
||||||
|
//static bool8 RockClimb_RideUp(struct Task *, struct ObjectEvent *);
|
||||||
|
//static bool8 RockClimb_RideDown(struct Task *, struct ObjectEvent *);
|
||||||
|
static bool8 RockClimb_ContinueRideOrEnd(struct Task *, struct ObjectEvent *);
|
||||||
|
static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent);
|
||||||
|
static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent);
|
||||||
// Static RAM declarations
|
// Static RAM declarations
|
||||||
|
|
||||||
static u8 sActiveList[32];
|
static u8 sActiveList[32];
|
||||||
@@ -1987,7 +1999,7 @@ static bool8 WaterfallFieldEffect_ContinueRideOrEnd(struct Task *task, struct Ob
|
|||||||
{
|
{
|
||||||
if (!ObjectEventClearHeldMovementIfFinished(objectEvent))
|
if (!ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (MetatileBehavior_IsWaterfall(objectEvent->currentMetatileBehavior))
|
if (MetatileBehavior_IsWaterfall(objectEvent->currentMetatileBehavior))
|
||||||
{
|
{
|
||||||
// Still ascending waterfall, back to WaterfallFieldEffect_RideUp
|
// Still ascending waterfall, back to WaterfallFieldEffect_RideUp
|
||||||
@@ -4156,6 +4168,263 @@ u8 FldEff_CaveDust(void)
|
|||||||
return spriteId;
|
return spriteId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ROCK CLIMB
|
||||||
|
enum RockClimbState
|
||||||
|
{
|
||||||
|
STATE_ROCK_CLIMB_INIT,
|
||||||
|
STATE_ROCK_CLIMB_POSE,
|
||||||
|
STATE_ROCK_CLIMB_SHOW_MON,
|
||||||
|
STATE_ROCK_CLIMB_JUMP_ON,
|
||||||
|
STATE_ROCK_CLIMB_WAIT_JUMP,
|
||||||
|
STATE_ROCK_CLIMB_RIDE,
|
||||||
|
STATE_ROCK_CLIMB_CONTINUE_RIDE,
|
||||||
|
STATE_ROCK_CLIMB_STOP_INIT,
|
||||||
|
STATE_ROCK_CLIMB_WAIT_STOP
|
||||||
|
};
|
||||||
|
|
||||||
|
#define tState data[0]
|
||||||
|
#define tDestX data[1]
|
||||||
|
#define tDestY data[2]
|
||||||
|
#define tMonId data[15]
|
||||||
|
|
||||||
|
static u8 CreateRockClimbBlob(void)
|
||||||
|
{
|
||||||
|
u8 spriteId;
|
||||||
|
struct Sprite *sprite;
|
||||||
|
|
||||||
|
SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
|
||||||
|
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96);
|
||||||
|
if (spriteId != MAX_SPRITES)
|
||||||
|
{
|
||||||
|
sprite = &gSprites[spriteId];
|
||||||
|
sprite->coordOffsetEnabled = TRUE;
|
||||||
|
sprite->oam.paletteNum = LoadPlayerObjectEventPalette(gSaveBlock2Ptr->playerGender);
|
||||||
|
sprite->data[2] = gFieldEffectArguments[2];
|
||||||
|
sprite->data[3] = -1;
|
||||||
|
sprite->data[6] = -1;
|
||||||
|
sprite->data[7] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return spriteId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 (*const sRockClimbFieldEffectFuncs[])(struct Task *, struct ObjectEvent *) =
|
||||||
|
{
|
||||||
|
[STATE_ROCK_CLIMB_INIT] = RockClimb_Init,
|
||||||
|
[STATE_ROCK_CLIMB_POSE] = RockClimb_FieldMovePose,
|
||||||
|
[STATE_ROCK_CLIMB_SHOW_MON] = RockClimb_ShowMon,
|
||||||
|
[STATE_ROCK_CLIMB_JUMP_ON] = RockClimb_JumpOnRockClimbBlob,
|
||||||
|
[STATE_ROCK_CLIMB_WAIT_JUMP] = RockClimb_WaitJumpOnRockClimbBlob,
|
||||||
|
[STATE_ROCK_CLIMB_RIDE] = RockClimb_Ride,
|
||||||
|
[STATE_ROCK_CLIMB_CONTINUE_RIDE] = RockClimb_ContinueRideOrEnd,
|
||||||
|
[STATE_ROCK_CLIMB_STOP_INIT] = RockClimb_StopRockClimbInit,
|
||||||
|
[STATE_ROCK_CLIMB_WAIT_STOP] = RockClimb_WaitStopRockClimb
|
||||||
|
};
|
||||||
|
|
||||||
|
bool8 FldEff_UseRockClimb(void)
|
||||||
|
{
|
||||||
|
u8 taskId;
|
||||||
|
taskId = CreateTask(Task_UseRockClimb, 0xff);
|
||||||
|
gTasks[taskId].tMonId = gFieldEffectArguments[0];
|
||||||
|
Task_UseRockClimb(taskId);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Task_UseRockClimb(u8 taskId)
|
||||||
|
{
|
||||||
|
while (sRockClimbFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId]));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_Init(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
LockPlayerFieldControls();
|
||||||
|
FreezeObjectEvents();
|
||||||
|
// Put follower into pokeball before using Rock Climb
|
||||||
|
HideFollowerForFieldEffect();
|
||||||
|
gPlayerAvatar.preventStep = TRUE;
|
||||||
|
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING);
|
||||||
|
PlayerGetDestCoords(&task->tDestX, &task->tDestY);
|
||||||
|
MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->tDestX, &task->tDestY);
|
||||||
|
task->tState++;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_FieldMovePose(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
|
{
|
||||||
|
SetPlayerAvatarFieldMove();
|
||||||
|
ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
|
||||||
|
task->tState++;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_ShowMon(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (ObjectEventCheckHeldMovementStatus(objectEvent))
|
||||||
|
{
|
||||||
|
gFieldEffectArguments[0] = task->tMonId | 0x80000000;
|
||||||
|
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
|
||||||
|
task->tState++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
|
||||||
|
{
|
||||||
|
objectEvent->noShadow = TRUE; // hide shadow
|
||||||
|
ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING));
|
||||||
|
ObjectEventClearHeldMovementIfFinished(objectEvent);
|
||||||
|
ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection));
|
||||||
|
gFieldEffectArguments[0] = task->tDestX;
|
||||||
|
gFieldEffectArguments[1] = task->tDestY;
|
||||||
|
gFieldEffectArguments[2] = gPlayerAvatar.objectEventId;
|
||||||
|
objectEvent->fieldEffectSpriteId = CreateRockClimbBlob();
|
||||||
|
task->tState++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
|
{
|
||||||
|
SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON);
|
||||||
|
switch (objectEvent->facingDirection)
|
||||||
|
{
|
||||||
|
case DIR_EAST:
|
||||||
|
//check southeast then northeast
|
||||||
|
if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY + 1)))
|
||||||
|
objectEvent->movementDirection = DIR_SOUTHEAST;
|
||||||
|
else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY - 1)))
|
||||||
|
objectEvent->movementDirection = DIR_NORTHEAST;
|
||||||
|
break;
|
||||||
|
case DIR_WEST:
|
||||||
|
//check northwest then southwest
|
||||||
|
if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY - 1)))
|
||||||
|
objectEvent->movementDirection = DIR_NORTHWEST;
|
||||||
|
else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY + 1)))
|
||||||
|
objectEvent->movementDirection = DIR_SOUTHWEST;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
task->tState = STATE_ROCK_CLIMB_CONTINUE_RIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct RockClimbRide
|
||||||
|
{
|
||||||
|
u8 action;
|
||||||
|
s8 dx;
|
||||||
|
s8 dy;
|
||||||
|
u8 jumpDir;
|
||||||
|
};
|
||||||
|
static const struct RockClimbRide sRockClimbMovement[] =
|
||||||
|
{
|
||||||
|
[DIR_NONE] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, 0, DIR_NONE},
|
||||||
|
[DIR_SOUTH] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, -1, DIR_SOUTH},
|
||||||
|
[DIR_NORTH] = {MOVEMENT_ACTION_WALK_FAST_UP, 0, 1, DIR_NORTH},
|
||||||
|
[DIR_WEST] = {MOVEMENT_ACTION_WALK_FAST_LEFT, 1, 1, DIR_WEST},
|
||||||
|
[DIR_EAST] = {MOVEMENT_ACTION_WALK_FAST_RIGHT, -1, -1, DIR_EAST},
|
||||||
|
[DIR_SOUTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT, 1, -1, DIR_WEST},
|
||||||
|
[DIR_SOUTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT, -1, -1, DIR_EAST},
|
||||||
|
[DIR_NORTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT, 1, 1, DIR_WEST},
|
||||||
|
[DIR_NORTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT, -1, 1, DIR_EAST},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void RockClimbDust(struct ObjectEvent *objectEvent, u8 direction)
|
||||||
|
{
|
||||||
|
s8 dx = sRockClimbMovement[direction].dx;
|
||||||
|
s8 dy = sRockClimbMovement[direction].dy;
|
||||||
|
|
||||||
|
gFieldEffectArguments[0] = objectEvent->currentCoords.x + dx;
|
||||||
|
gFieldEffectArguments[1] = objectEvent->currentCoords.y + dy;
|
||||||
|
gFieldEffectArguments[2] = objectEvent->previousElevation;
|
||||||
|
gFieldEffectArguments[3] = gSprites[objectEvent->spriteId].oam.priority;
|
||||||
|
FieldEffectStart(FLDEFF_ROCK_CLIMB_DUST);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
ObjectEventSetHeldMovement(objectEvent, sRockClimbMovement[objectEvent->movementDirection].action);
|
||||||
|
PlaySE(SE_M_ROCK_THROW);
|
||||||
|
RockClimbDust(objectEvent, objectEvent->movementDirection);
|
||||||
|
task->tState++;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (!ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
PlayerGetDestCoords(&task->tDestX, &task->tDestY);
|
||||||
|
MoveCoords(objectEvent->movementDirection, &task->tDestX, &task->tDestY);
|
||||||
|
if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX, task->tDestY)))
|
||||||
|
{
|
||||||
|
task->tState = STATE_ROCK_CLIMB_RIDE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LockPlayerFieldControls();
|
||||||
|
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING;
|
||||||
|
gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT;
|
||||||
|
task->tState++;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
if (ObjectEventIsMovementOverridden(objectEvent))
|
||||||
|
{
|
||||||
|
if (!ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RockClimbDust(objectEvent, DIR_NONE); //dust on final spot
|
||||||
|
ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(sRockClimbMovement[objectEvent->movementDirection].jumpDir));
|
||||||
|
SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE);
|
||||||
|
task->tState++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent)
|
||||||
|
{
|
||||||
|
struct ObjectEvent *followerObject = GetFollowerObject();
|
||||||
|
if (ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||||
|
{
|
||||||
|
ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL));
|
||||||
|
ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection));
|
||||||
|
gPlayerAvatar.preventStep = FALSE;
|
||||||
|
if (followerObject)
|
||||||
|
ObjectEventClearHeldMovementIfFinished(followerObject); // restore follower to normal
|
||||||
|
objectEvent->noShadow = FALSE; // restore shadow
|
||||||
|
UnfreezeObjectEvents();
|
||||||
|
UnlockPlayerFieldControls();
|
||||||
|
DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]);
|
||||||
|
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB);
|
||||||
|
objectEvent->triggerGroundEffectsOnMove = TRUE; // e.g. if dismount on grass
|
||||||
|
DestroyTask(FindTaskIdByFunc(Task_UseRockClimb));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 IsRockClimbActive(void)
|
||||||
|
{
|
||||||
|
if (FieldEffectActiveListContains(FLDEFF_USE_ROCK_CLIMB))
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#undef tState
|
#undef tState
|
||||||
#undef tSpriteId
|
#undef tSpriteId
|
||||||
#undef tTargetX
|
#undef tTargetX
|
||||||
|
@@ -1263,10 +1263,10 @@ static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sp
|
|||||||
[DIR_NORTH] = 1,
|
[DIR_NORTH] = 1,
|
||||||
[DIR_WEST] = 2,
|
[DIR_WEST] = 2,
|
||||||
[DIR_EAST] = 3,
|
[DIR_EAST] = 3,
|
||||||
[DIR_SOUTHWEST] = 0,
|
[DIR_SOUTHWEST] = 2,
|
||||||
[DIR_SOUTHEAST] = 0,
|
[DIR_SOUTHEAST] = 3,
|
||||||
[DIR_NORTHWEST] = 1,
|
[DIR_NORTHWEST] = 2,
|
||||||
[DIR_NORTHEAST] = 1,
|
[DIR_NORTHEAST] = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!GetSurfBlob_DontSyncAnim(sprite))
|
if (!GetSurfBlob_DontSyncAnim(sprite))
|
||||||
@@ -1389,6 +1389,24 @@ u32 FldEff_Dust(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 FldEff_RockClimbDust(void)
|
||||||
|
{
|
||||||
|
u8 spriteId;
|
||||||
|
struct Sprite *sprite;
|
||||||
|
|
||||||
|
SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
|
||||||
|
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
|
||||||
|
if (spriteId != MAX_SPRITES)
|
||||||
|
{
|
||||||
|
sprite = &gSprites[spriteId];
|
||||||
|
sprite->coordOffsetEnabled = TRUE;
|
||||||
|
sprite->oam.priority = gFieldEffectArguments[3];
|
||||||
|
sprite->data[0] = gFieldEffectArguments[2];
|
||||||
|
sprite->data[1] = FLDEFF_ROCK_CLIMB_DUST;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Sprite data for FLDEFF_SAND_PILE
|
// Sprite data for FLDEFF_SAND_PILE
|
||||||
#define sLocalId data[0]
|
#define sLocalId data[0]
|
||||||
#define sMapNum data[1]
|
#define sMapNum data[1]
|
||||||
|
@@ -48,6 +48,13 @@ static bool32 IsFieldMoveUnlocked_Waterfall(void)
|
|||||||
return FlagGet(FLAG_BADGE08_GET);
|
return FlagGet(FLAG_BADGE08_GET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE
|
||||||
|
static bool32 IsFieldMoveUnlocked_RockClimb(void)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool32 IsFieldMoveUnlocked_Teleport(void)
|
static bool32 IsFieldMoveUnlocked_Teleport(void)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -198,7 +205,15 @@ const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] =
|
|||||||
.moveID = MOVE_SWEET_SCENT,
|
.moveID = MOVE_SWEET_SCENT,
|
||||||
.partyMsgID = PARTY_MSG_CANT_USE_HERE,
|
.partyMsgID = PARTY_MSG_CANT_USE_HERE,
|
||||||
},
|
},
|
||||||
|
#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE
|
||||||
|
[FIELD_MOVE_ROCK_CLIMB] =
|
||||||
|
{
|
||||||
|
.fieldMoveFunc = SetUpFieldMove_RockClimb,
|
||||||
|
.isUnlockedFunc = IsFieldMoveUnlocked_RockClimb,
|
||||||
|
.moveID = MOVE_ROCK_CLIMB,
|
||||||
|
.partyMsgID = PARTY_MSG_CANT_USE_HERE,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
#if OW_DEFOG_FIELD_MOVE == TRUE
|
#if OW_DEFOG_FIELD_MOVE == TRUE
|
||||||
[FIELD_MOVE_DEFOG] =
|
[FIELD_MOVE_DEFOG] =
|
||||||
{
|
{
|
||||||
@@ -208,5 +223,4 @@ const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] =
|
|||||||
.partyMsgID = PARTY_MSG_CANT_USE_HERE,
|
.partyMsgID = PARTY_MSG_CANT_USE_HERE,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@@ -133,6 +133,7 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] =
|
|||||||
[MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM] = TILE_FLAG_UNUSED,
|
[MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM] = TILE_FLAG_UNUSED,
|
||||||
[MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM] = TILE_FLAG_UNUSED,
|
[MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM] = TILE_FLAG_UNUSED,
|
||||||
[MB_ROCK_STAIRS] = TILE_FLAG_UNUSED,
|
[MB_ROCK_STAIRS] = TILE_FLAG_UNUSED,
|
||||||
|
[MB_ROCK_CLIMB] = TILE_FLAG_UNUSED,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool8 MetatileBehavior_IsATile(u8 metatileBehavior)
|
bool8 MetatileBehavior_IsATile(u8 metatileBehavior)
|
||||||
@@ -1542,3 +1543,11 @@ bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior)
|
|||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior)
|
||||||
|
{
|
||||||
|
if (metatileBehavior == MB_ROCK_CLIMB)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
@@ -489,6 +489,7 @@ void TryItemHoldFormChange(struct Pokemon *mon, s8 slotId);
|
|||||||
static void ShowMoveSelectWindow(u8 slot);
|
static void ShowMoveSelectWindow(u8 slot);
|
||||||
static void Task_HandleWhichMoveInput(u8 taskId);
|
static void Task_HandleWhichMoveInput(u8 taskId);
|
||||||
static void Task_HideFollowerNPCForTeleport(u8);
|
static void Task_HideFollowerNPCForTeleport(u8);
|
||||||
|
static void FieldCallback_RockClimb(void);
|
||||||
|
|
||||||
// static const data
|
// static const data
|
||||||
#include "data/party_menu.h"
|
#include "data/party_menu.h"
|
||||||
@@ -4194,6 +4195,21 @@ bool32 SetUpFieldMove_Waterfall(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool32 SetUpFieldMove_RockClimb(void)
|
||||||
|
{
|
||||||
|
s16 x, y;
|
||||||
|
|
||||||
|
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||||
|
if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(x, y)))
|
||||||
|
{
|
||||||
|
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
|
||||||
|
gPostMenuFieldCallback = FieldCallback_RockClimb;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void FieldCallback_Dive(void)
|
static void FieldCallback_Dive(void)
|
||||||
{
|
{
|
||||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||||
@@ -7997,3 +8013,10 @@ void CursorCb_MoveItem(u8 taskId)
|
|||||||
gTasks[taskId].func = Task_UpdateHeldItemSprite;
|
gTasks[taskId].func = Task_UpdateHeldItemSprite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void FieldCallback_RockClimb(void)
|
||||||
|
{
|
||||||
|
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||||
|
FieldEffectStart(FLDEFF_USE_ROCK_CLIMB);
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user