add rock climb
This commit is contained in:
parent
a9719c92bf
commit
c1852434bb
@ -72,6 +72,8 @@ gFieldEffectScriptPointers:: @ 82DB9D4
|
||||
.4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT
|
||||
.4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK
|
||||
.4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK
|
||||
.4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB
|
||||
.4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST
|
||||
|
||||
gFieldEffectScript_ExclamationMarkIcon1:: @ 82DBAE0
|
||||
field_eff_callnative FldEff_ExclamationMarkIcon
|
||||
@ -343,3 +345,12 @@ gFieldEffectScript_DestroyDeoxysRock:: @ 82DBCF9
|
||||
gFieldEffectScript_MoveDeoxysRock:: @ 82DBCFF
|
||||
field_eff_callnative FldEff_MoveDeoxysRock
|
||||
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
|
||||
|
||||
|
||||
@ -301,3 +301,29 @@ EventScript_FailSweetScent:: @ 8290CAE
|
||||
|
||||
Text_FailSweetScent: @ 8290CB7
|
||||
.string "Looks like there's nothing here…$"
|
||||
|
||||
|
||||
EventScript_UseRockClimb::
|
||||
lockall
|
||||
checkpartymove MOVE_ROCK_CLIMB
|
||||
compare VAR_RESULT, PARTY_SIZE
|
||||
goto_if_eq EventScript_CantRockClimb
|
||||
bufferpartymonnick 0, VAR_RESULT
|
||||
setfieldeffectargument 0, VAR_RESULT
|
||||
msgbox Text_WantToRockClimb, MSGBOX_YESNO
|
||||
compare VAR_RESULT, NO
|
||||
goto_if_eq EventScript_EndRockClimb
|
||||
msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT
|
||||
dofieldeffect FLDEFF_USE_ROCK_CLIMB
|
||||
goto EventScript_EndRockClimb
|
||||
EventScript_CantRockClimb:: @ 8290A84
|
||||
msgbox Text_CantRockClimb, MSGBOX_DEFAULT
|
||||
EventScript_EndRockClimb:: @ 8290A8C
|
||||
releaseall
|
||||
end
|
||||
Text_WantToRockClimb:
|
||||
.string "The cliff is steep.\nWould you like to use Rock Climb?$"
|
||||
Text_MonUsedRockClimb:
|
||||
.string "{STR_VAR_1} used Rock Climb!$"
|
||||
Text_CantRockClimb:
|
||||
.string "The cliff is steep.\nA 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 |
@ -241,6 +241,11 @@
|
||||
#define MOVEMENT_ACTION_FIGURE_8 0x9B
|
||||
#define MOVEMENT_ACTION_FLY_UP 0x9C
|
||||
#define MOVEMENT_ACTION_FLY_DOWN 0x9D
|
||||
//fast diagonal movement
|
||||
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT 0x9E
|
||||
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT 0x9F
|
||||
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT 0xA0
|
||||
#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT 0xA1
|
||||
|
||||
#define MOVEMENT_ACTION_STEP_END 0xFE
|
||||
|
||||
|
||||
@ -68,6 +68,8 @@
|
||||
#define FLDEFF_RAYQUAZA_SPOTLIGHT 64
|
||||
#define FLDEFF_DESTROY_DEOXYS_ROCK 65
|
||||
#define FLDEFF_MOVE_DEOXYS_ROCK 66
|
||||
#define FLDEFF_USE_ROCK_CLIMB 67
|
||||
#define FLDEFF_ROCK_CLIMB_DUST 68
|
||||
|
||||
#define FLDEFFOBJ_SHADOW_S 0
|
||||
#define FLDEFFOBJ_SHADOW_M 1
|
||||
@ -106,6 +108,8 @@
|
||||
#define FLDEFFOBJ_BUBBLES 34
|
||||
#define FLDEFFOBJ_SMALL_SPARKLE 35
|
||||
#define FLDEFFOBJ_RAYQUAZA 36
|
||||
#define FLDEFFOBJ_ROCK_CLIMB_BLOB 37
|
||||
#define FLDEFFOBJ_ROCK_CLIMB_DUST 38
|
||||
|
||||
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
|
||||
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
|
||||
@ -119,5 +123,6 @@
|
||||
#define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F
|
||||
#define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010
|
||||
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
|
||||
#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1012
|
||||
|
||||
#endif // GUARD_FIELD_EFFECT_CONSTANTS_H
|
||||
|
||||
@ -240,6 +240,6 @@
|
||||
#define MB_UNUSED_EC 0xEC
|
||||
#define MB_UNUSED_ED 0xED
|
||||
#define MB_UNUSED_EE 0xEE
|
||||
#define MB_UNUSED_EF 0xEF
|
||||
#define MB_ROCK_CLIMB 0xEF
|
||||
|
||||
#endif // GUARD_METATILE_BEHAVIORS
|
||||
|
||||
@ -541,6 +541,7 @@ extern const u8 EventScript_UseWaterfall[];
|
||||
extern const u8 EventScript_CannotUseWaterfall[];
|
||||
extern const u8 EventScript_UseDive[];
|
||||
extern const u8 EventScript_UseDiveUnderwater[];
|
||||
extern const u8 EventScript_UseRockClimb[];
|
||||
extern const u8 EventScript_FallDownHole[];
|
||||
extern const u8 EventScript_FieldPoison[];
|
||||
extern const u8 EventScript_EggHatch[];
|
||||
|
||||
@ -46,5 +46,6 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b);
|
||||
void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId);
|
||||
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority);
|
||||
void StartEscapeRopeFieldEffect(void);
|
||||
bool8 IsRockClimbActive(void);
|
||||
|
||||
#endif // GUARD_FIELD_EFFECTS_H
|
||||
|
||||
@ -145,5 +145,6 @@ bool8 MetatileBehavior_IsQuestionnaire(u8);
|
||||
bool8 MetatileBehavior_IsLongGrass_Duplicate(u8);
|
||||
bool8 MetatileBehavior_IsLongGrassSouthEdge(u8);
|
||||
bool8 MetatileBehavior_IsTrainerHillTimer(u8);
|
||||
bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior);
|
||||
|
||||
#endif // GUARD_METATILE_BEHAVIOR
|
||||
|
||||
@ -606,6 +606,9 @@ $(FLDEFFGFXDIR)/deep_sand_footprints.4bpp: %.4bpp: %.png
|
||||
$(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 2 -mheight 1
|
||||
|
||||
$(FLDEFFGFXDIR)/rock_climb_dust.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
$(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 2 -mheight 2
|
||||
|
||||
@ -630,6 +633,9 @@ $(FLDEFFGFXDIR)/short_grass.4bpp: %.4bpp: %.png
|
||||
$(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
$(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 2 -mheight 2
|
||||
|
||||
|
||||
@ -35,6 +35,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch;
|
||||
const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles;
|
||||
const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle;
|
||||
const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza;
|
||||
const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob;
|
||||
const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust;
|
||||
|
||||
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
||||
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
|
||||
@ -74,4 +76,6 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
|
||||
[FLDEFFOBJ_BUBBLES] = &gFieldEffectObjectTemplate_Bubbles,
|
||||
[FLDEFFOBJ_SMALL_SPARKLE] = &gFieldEffectObjectTemplate_SmallSparkle,
|
||||
[FLDEFFOBJ_RAYQUAZA] = &gFieldEffectObjectTemplate_Rayquaza,
|
||||
[FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob,
|
||||
[FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust,
|
||||
};
|
||||
|
||||
@ -1287,3 +1287,48 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = {
|
||||
};
|
||||
|
||||
static const struct SpritePalette sSpritePalette_Unused = {gObjectEventPalette2, FLDEFF_PAL_TAG_UNKNOWN};
|
||||
|
||||
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};
|
||||
|
||||
@ -261,6 +261,13 @@ u8 MovementAction_FlyUp_Step1(struct ObjectEvent *, struct Sprite *);
|
||||
u8 MovementAction_Fly_Finish(struct ObjectEvent *, struct Sprite *);
|
||||
u8 MovementAction_FlyDown_Step0(struct ObjectEvent *, struct Sprite *);
|
||||
u8 MovementAction_FlyDown_Step1(struct ObjectEvent *, struct 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_FaceUp[])(struct ObjectEvent *, struct Sprite *);
|
||||
@ -420,6 +427,12 @@ u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *,
|
||||
u8 (*const gMovementActionFuncs_Figure8[])(struct ObjectEvent *, struct Sprite *);
|
||||
u8 (*const gMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *);
|
||||
u8 (*const gMovementActionFuncs_FlyDown[])(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 *) = {
|
||||
[MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown,
|
||||
@ -580,6 +593,12 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *)
|
||||
[MOVEMENT_ACTION_FIGURE_8] = gMovementActionFuncs_Figure8,
|
||||
[MOVEMENT_ACTION_FLY_UP] = gMovementActionFuncs_FlyUp,
|
||||
[MOVEMENT_ACTION_FLY_DOWN] = gMovementActionFuncs_FlyDown,
|
||||
//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 *) = {
|
||||
@ -1511,3 +1530,29 @@ u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *,
|
||||
MovementAction_DestroyExtraTaskIfAtTop_Step0,
|
||||
MovementAction_Finish,
|
||||
};
|
||||
|
||||
// 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_LansatBerryTree[] = INCBIN_U32("graphics/object_events
|
||||
const u32 gObjectEventPic_DurinBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/durin.4bpp");
|
||||
const u32 gObjectEventPic_TamatoBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/tamato.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 u16 gObjectEventPalette12[] = INCBIN_U16("graphics/object_events/palettes/12.gbapal");
|
||||
const u16 gObjectEventPalette13[] = INCBIN_U16("graphics/object_events/palettes/13.gbapal");
|
||||
@ -325,6 +327,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_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_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_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp");
|
||||
const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp");
|
||||
|
||||
@ -717,6 +717,7 @@ enum
|
||||
FIELD_MOVE_MILK_DRINK,
|
||||
FIELD_MOVE_SOFT_BOILED,
|
||||
FIELD_MOVE_SWEET_SCENT,
|
||||
FIELD_MOVE_ROCK_CLIMB,
|
||||
};
|
||||
|
||||
// What a weird choice of table termination;
|
||||
@ -761,6 +762,7 @@ struct
|
||||
[MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCb_FieldMove},
|
||||
[MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove},
|
||||
[MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove},
|
||||
[MENU_FIELD_MOVES + FIELD_MOVE_ROCK_CLIMB] = {gMoveNames[MOVE_ROCK_CLIMB], CursorCb_FieldMove},
|
||||
};
|
||||
|
||||
static const u8 sPartyMenuAction_SummarySwitchCancel[] = {MENU_SUMMARY, MENU_SWITCH, MENU_CANCEL1};
|
||||
@ -835,7 +837,7 @@ static const u8 sPartyMenuActionCounts[] =
|
||||
static const u16 sFieldMoves[] =
|
||||
{
|
||||
MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, MOVE_TELEPORT,
|
||||
MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, FIELD_MOVE_TERMINATOR
|
||||
MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, MOVE_ROCK_CLIMB, FIELD_MOVE_TERMINATOR
|
||||
};
|
||||
|
||||
struct
|
||||
@ -858,6 +860,7 @@ struct
|
||||
[FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP},
|
||||
[FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP},
|
||||
[FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE},
|
||||
[FIELD_MOVE_ROCK_CLIMB] = {SetUpFieldMove_RockClimb, PARTY_MSG_CANT_USE_HERE},
|
||||
};
|
||||
|
||||
static const u8 *const sUnionRoomTradeMessages[] =
|
||||
|
||||
@ -681,10 +681,10 @@ const u8 gFaceDirectionAnimNums[] = {
|
||||
[DIR_NORTH] = 1,
|
||||
[DIR_WEST] = 2,
|
||||
[DIR_EAST] = 3,
|
||||
[DIR_SOUTHWEST] = 0,
|
||||
[DIR_SOUTHEAST] = 0,
|
||||
[DIR_NORTHWEST] = 1,
|
||||
[DIR_NORTHEAST] = 1,
|
||||
[DIR_SOUTHWEST] = 2,
|
||||
[DIR_SOUTHEAST] = 3,
|
||||
[DIR_NORTHWEST] = 2,
|
||||
[DIR_NORTHEAST] = 3,
|
||||
};
|
||||
const u8 gMoveDirectionAnimNums[] = {
|
||||
[DIR_NONE] = 4,
|
||||
@ -692,10 +692,10 @@ const u8 gMoveDirectionAnimNums[] = {
|
||||
[DIR_NORTH] = 5,
|
||||
[DIR_WEST] = 6,
|
||||
[DIR_EAST] = 7,
|
||||
[DIR_SOUTHWEST] = 4,
|
||||
[DIR_SOUTHEAST] = 4,
|
||||
[DIR_NORTHWEST] = 5,
|
||||
[DIR_NORTHEAST] = 5,
|
||||
[DIR_SOUTHWEST] = 6,
|
||||
[DIR_SOUTHEAST] = 7,
|
||||
[DIR_NORTHWEST] = 6,
|
||||
[DIR_NORTHEAST] = 7,
|
||||
};
|
||||
const u8 gMoveDirectionFastAnimNums[] = {
|
||||
[DIR_NONE] = 8,
|
||||
@ -703,10 +703,10 @@ const u8 gMoveDirectionFastAnimNums[] = {
|
||||
[DIR_NORTH] = 9,
|
||||
[DIR_WEST] = 10,
|
||||
[DIR_EAST] = 11,
|
||||
[DIR_SOUTHWEST] = 8,
|
||||
[DIR_SOUTHEAST] = 8,
|
||||
[DIR_NORTHWEST] = 9,
|
||||
[DIR_NORTHEAST] = 9,
|
||||
[DIR_SOUTHWEST] = 10,
|
||||
[DIR_SOUTHEAST] = 11,
|
||||
[DIR_NORTHWEST] = 10,
|
||||
[DIR_NORTHEAST] = 11,
|
||||
};
|
||||
const u8 gMoveDirectionFasterAnimNums[] = {
|
||||
[DIR_NONE] = 12,
|
||||
@ -736,10 +736,10 @@ const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon
|
||||
[DIR_NORTH] = 21,
|
||||
[DIR_WEST] = 22,
|
||||
[DIR_EAST] = 23,
|
||||
[DIR_SOUTHWEST] = 20,
|
||||
[DIR_SOUTHEAST] = 20,
|
||||
[DIR_NORTHWEST] = 21,
|
||||
[DIR_NORTHEAST] = 21,
|
||||
[DIR_SOUTHWEST] = 22,
|
||||
[DIR_SOUTHEAST] = 23,
|
||||
[DIR_NORTHWEST] = 22,
|
||||
[DIR_NORTHEAST] = 23,
|
||||
};
|
||||
const u8 gAcroWheelieDirectionAnimNums[] = {
|
||||
[DIR_NONE] = 20,
|
||||
@ -969,6 +969,10 @@ const u8 gJumpSpecialMovementActions[] = {
|
||||
MOVEMENT_ACTION_JUMP_SPECIAL_UP,
|
||||
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
|
||||
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[] = {
|
||||
MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,
|
||||
@ -9006,3 +9010,40 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// fast diagonal
|
||||
bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 1);
|
||||
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||
}
|
||||
|
||||
bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 1);
|
||||
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||
}
|
||||
|
||||
bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 1);
|
||||
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||
}
|
||||
|
||||
bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 1);
|
||||
return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite);
|
||||
}
|
||||
|
||||
bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite))
|
||||
{
|
||||
sprite->data[2] = 2;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "event_scripts.h"
|
||||
#include "fieldmap.h"
|
||||
#include "field_control_avatar.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_poison.h"
|
||||
#include "field_screen_effect.h"
|
||||
@ -409,6 +410,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me
|
||||
return EventScript_Questionnaire;
|
||||
if (MetatileBehavior_IsTrainerHillTimer(metatileBehavior) == TRUE)
|
||||
return EventScript_TrainerHillTimer;
|
||||
if (MetatileBehavior_IsRockClimbable(metatileBehavior) == TRUE && !IsRockClimbActive())
|
||||
return EventScript_UseRockClimb;
|
||||
|
||||
height = position->height;
|
||||
if (height == MapGridGetZCoordAt(position->x, position->y))
|
||||
|
||||
@ -231,6 +231,18 @@ static void SpriteCB_DeoxysRockFragment(struct Sprite* sprite);
|
||||
|
||||
static void Task_MoveDeoxysRock(u8 taskId);
|
||||
|
||||
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 u8 sActiveList[32];
|
||||
@ -3880,3 +3892,256 @@ static void Task_MoveDeoxysRock(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
// 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 = 0;
|
||||
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)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
FreezeObjectEvents();
|
||||
gPlayerAvatar.preventStep = TRUE;
|
||||
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))
|
||||
{
|
||||
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))
|
||||
{
|
||||
SetSurfBobState(objectEvent->fieldEffectSpriteId, 1);
|
||||
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++;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
ScriptContext2_Enable();
|
||||
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));
|
||||
SetSurfBobState(objectEvent->fieldEffectSpriteId, 0);
|
||||
task->tState++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent)
|
||||
{
|
||||
if (ObjectEventClearHeldMovementIfFinished(objectEvent))
|
||||
{
|
||||
ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL));
|
||||
ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection));
|
||||
gPlayerAvatar.preventStep = FALSE;
|
||||
ScriptContext2_Disable();
|
||||
DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]);
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB);
|
||||
DestroyTask(FindTaskIdByFunc(Task_UseRockClimb));
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 IsRockClimbActive(void)
|
||||
{
|
||||
if (FieldEffectActiveListContains(FLDEFF_USE_ROCK_CLIMB))
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
#undef tState
|
||||
#undef tDestX
|
||||
#undef tDestY
|
||||
#undef tMonId
|
||||
|
||||
|
||||
@ -1057,10 +1057,12 @@ static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *
|
||||
{
|
||||
sprite->pos2.y += sprite->data[3];
|
||||
}
|
||||
|
||||
if ((sprite->data[4] & 0x0F) == 0)
|
||||
{
|
||||
sprite->data[3] = -sprite->data[3];
|
||||
}
|
||||
|
||||
if (bobState != 2)
|
||||
{
|
||||
if (GetSurfBobWhileFishingState(sprite) == 0)
|
||||
@ -1120,6 +1122,24 @@ u32 FldEff_Dust(void)
|
||||
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;
|
||||
}
|
||||
|
||||
u32 FldEff_SandPile(void)
|
||||
{
|
||||
u8 objectEventId;
|
||||
|
||||
@ -249,7 +249,7 @@ static const u8 sTileBitAttributes[] =
|
||||
[MB_UNUSED_EC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_ED] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_ROCK_CLIMB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
};
|
||||
|
||||
bool8 MetatileBehavior_IsATile(u8 metatileBehavior)
|
||||
@ -1488,3 +1488,11 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior)
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior)
|
||||
{
|
||||
if (metatileBehavior == MB_ROCK_CLIMB)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -405,6 +405,7 @@ static bool8 SetUpFieldMove_Surf(void);
|
||||
static bool8 SetUpFieldMove_Fly(void);
|
||||
static bool8 SetUpFieldMove_Waterfall(void);
|
||||
static bool8 SetUpFieldMove_Dive(void);
|
||||
static bool8 SetUpFieldMove_RockClimb(void);
|
||||
|
||||
// static const data
|
||||
#include "data/pokemon/tutor_learnsets.h"
|
||||
@ -6353,3 +6354,24 @@ void IsLastMonThatKnowsSurf(void)
|
||||
gSpecialVar_Result = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void FieldCallback_RockClimb(void)
|
||||
{
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
FieldEffectStart(FLDEFF_USE_ROCK_CLIMB);
|
||||
}
|
||||
|
||||
static bool8 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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user