add rock climb

This commit is contained in:
Evan 2020-08-30 19:37:38 -06:00
parent a9719c92bf
commit c1852434bb
23 changed files with 553 additions and 19 deletions

View File

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

View File

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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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[] =

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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