From 565114625f3e8505b157c0c444c5d40caba150ee Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 25 Feb 2020 16:35:38 -0500 Subject: fldeff_cut through SetUpFieldMove_Cut --- asm/field_control_avatar.s | 2 +- asm/field_player_avatar.s | 12 ++-- asm/fldeff_cut.s | 161 ++++---------------------------------------- include/field_specials.h | 1 + include/fieldmap.h | 5 +- include/metatile_behavior.h | 2 +- ld_script.txt | 1 + src/fieldmap.c | 30 ++++----- src/fldeff_cut.c | 68 +++++++++++++++++++ src/metatile_behavior.c | 41 ++--------- src/wild_encounter.c | 22 +++--- sym_ewram.txt | 4 +- 12 files changed, 129 insertions(+), 220 deletions(-) create mode 100644 src/fldeff_cut.c diff --git a/asm/field_control_avatar.s b/asm/field_control_avatar.s index b74e60d1f..f1bef0721 100644 --- a/asm/field_control_avatar.s +++ b/asm/field_control_avatar.s @@ -332,7 +332,7 @@ sub_806CAC8: @ 806CAC8 movs r2, 0x2 ldrsh r1, [r4, r2] movs r2, 0xFF - bl sub_8058F48 + bl MapGridGetMetatileAttributeAt mov r8, r0 mov r0, sp movs r1, 0 diff --git a/asm/field_player_avatar.s b/asm/field_player_avatar.s index 5510caceb..6e425d2c7 100644 --- a/asm/field_player_avatar.s +++ b/asm/field_player_avatar.s @@ -2921,7 +2921,7 @@ IsPlayerFacingSurfableFishableWater: @ 805C8B0 ldrsh r0, [r0, r1] movs r2, 0 ldrsh r1, [r5, r2] - bl sub_805C938 + bl MetatileAtCoordsIsWaterTile lsls r0, 24 lsrs r0, 24 cmp r0, 0x1 @@ -2940,24 +2940,24 @@ _0805C92E: bx r1 thumb_func_end IsPlayerFacingSurfableFishableWater - thumb_func_start sub_805C938 -sub_805C938: @ 805C938 + thumb_func_start MetatileAtCoordsIsWaterTile +MetatileAtCoordsIsWaterTile: @ 805C938 push {lr} lsls r0, 16 asrs r0, 16 lsls r1, 16 asrs r1, 16 movs r2, 0x1 - bl sub_8058F48 + bl MapGridGetMetatileAttributeAt lsls r0, 24 lsrs r0, 24 movs r1, 0x2 - bl sub_805A2BC + bl TestMetatileAttributeBit lsls r0, 24 lsrs r0, 24 pop {r1} bx r1 - thumb_func_end sub_805C938 + thumb_func_end MetatileAtCoordsIsWaterTile thumb_func_start ClearPlayerAvatarInfo ClearPlayerAvatarInfo: @ 805C95C diff --git a/asm/fldeff_cut.s b/asm/fldeff_cut.s index c0266194e..fa7a114ab 100644 --- a/asm/fldeff_cut.s +++ b/asm/fldeff_cut.s @@ -5,143 +5,8 @@ .text - thumb_func_start sub_8097874 -sub_8097874: @ 8097874 - push {lr} - lsls r0, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - movs r2, 0x1 - bl sub_8058F48 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl sub_805A2BC - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_8097874 - - thumb_func_start SetUpFieldMove_Cut -SetUpFieldMove_Cut: @ 8097898 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - ldr r4, _080978CC @ =gUnknown_2039874 - movs r0, 0 - strb r0, [r4] - bl CutMoveRuinValleyCheck - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080978E0 - movs r0, 0x5F - bl CheckObjectGraphicsInFrontOfPlayer - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08097904 - ldr r1, _080978D0 @ =gFieldCallback2 - ldr r0, _080978D4 @ =FieldCallback_PrepareFadeInFromMenu - str r0, [r1] - ldr r1, _080978D8 @ =gPostMenuFieldCallback - ldr r0, _080978DC @ =sub_80979D0 - b _080978EC - .align 2, 0 -_080978CC: .4byte gUnknown_2039874 -_080978D0: .4byte gFieldCallback2 -_080978D4: .4byte FieldCallback_PrepareFadeInFromMenu -_080978D8: .4byte gPostMenuFieldCallback -_080978DC: .4byte sub_80979D0 -_080978E0: - strb r0, [r4] -_080978E2: - ldr r1, _080978F4 @ =gFieldCallback2 - ldr r0, _080978F8 @ =FieldCallback_PrepareFadeInFromMenu - str r0, [r1] - ldr r1, _080978FC @ =gPostMenuFieldCallback - ldr r0, _08097900 @ =sub_8097984 -_080978EC: - str r0, [r1] - movs r0, 0x1 - b _08097970 - .align 2, 0 -_080978F4: .4byte gFieldCallback2 -_080978F8: .4byte FieldCallback_PrepareFadeInFromMenu -_080978FC: .4byte gPostMenuFieldCallback -_08097900: .4byte sub_8097984 -_08097904: - ldr r4, _0809797C @ =gPlayerFacingPosition - adds r1, r4, 0x2 - adds r0, r4, 0 - bl PlayerGetDestCoords - movs r7, 0 - adds r2, r4, 0 - ldr r0, _08097980 @ =0x0000ffff - mov r8, r0 -_08097916: - mov r1, r8 - adds r0, r1, r7 - ldrh r1, [r2, 0x2] - adds r0, r1 - movs r6, 0 - lsls r0, 16 - asrs r5, r0, 16 -_08097924: - mov r1, r8 - adds r0, r1, r6 - ldrh r1, [r2] - adds r0, r1 - lsls r0, 16 - asrs r4, r0, 16 - adds r0, r4, 0 - adds r1, r5, 0 - str r2, [sp] - bl MapGridGetZCoordAt - lsls r0, 24 - lsrs r0, 24 - ldr r2, [sp] - movs r1, 0x4 - ldrsb r1, [r2, r1] - cmp r0, r1 - bne _0809795A - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8097874 - lsls r0, 24 - lsrs r0, 24 - ldr r2, [sp] - cmp r0, 0x1 - beq _080978E2 -_0809795A: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x2 - bls _08097924 - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0x2 - bls _08097916 - movs r0, 0 -_08097970: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0809797C: .4byte gPlayerFacingPosition -_08097980: .4byte 0x0000ffff - thumb_func_end SetUpFieldMove_Cut - - thumb_func_start sub_8097984 -sub_8097984: @ 8097984 + thumb_func_start FieldCallback_CutGrass +FieldCallback_CutGrass: @ 8097984 push {lr} movs r0, 0x1 bl FieldEffectStart @@ -154,7 +19,7 @@ sub_8097984: @ 8097984 bx r0 .align 2, 0 _0809799C: .4byte gFieldEffectArguments - thumb_func_end sub_8097984 + thumb_func_end FieldCallback_CutGrass thumb_func_start sub_80979A0 sub_80979A0: @ 80979A0 @@ -181,8 +46,8 @@ _080979C8: .4byte gTasks _080979CC: .4byte sub_8097A20 thumb_func_end sub_80979A0 - thumb_func_start sub_80979D0 -sub_80979D0: @ 80979D0 + thumb_func_start FieldCallback_CutTree +FieldCallback_CutTree: @ 80979D0 push {lr} bl GetCursorSelectionMonId ldr r1, _080979E8 @ =gFieldEffectArguments @@ -196,7 +61,7 @@ sub_80979D0: @ 80979D0 .align 2, 0 _080979E8: .4byte gFieldEffectArguments _080979EC: .4byte EventScript_FldEffCut - thumb_func_end sub_80979D0 + thumb_func_end FieldCallback_CutTree thumb_func_start sub_80979F0 sub_80979F0: @ 80979F0 @@ -228,14 +93,14 @@ sub_8097A20: @ 8097A20 push {lr} movs r0, 0x1 bl FieldEffectActiveListRemove - ldr r0, _08097A38 @ =gUnknown_2039874 + ldr r0, _08097A38 @ =sScheduleOpenDottedHole ldrb r0, [r0] cmp r0, 0x1 bne _08097A3C bl CutMoveOpenDottedHoleDoor b _08097A42 .align 2, 0 -_08097A38: .4byte gUnknown_2039874 +_08097A38: .4byte sScheduleOpenDottedHole _08097A3C: movs r0, 0x3A bl FieldEffectStart @@ -289,7 +154,7 @@ _08097A78: bne _08097ABC adds r0, r4, 0 adds r1, r5, 0 - bl sub_8097874 + bl MetatileAtCoordsIsGrassTile lsls r0, 24 lsrs r0, 24 cmp r0, 0x1 @@ -312,7 +177,7 @@ _08097ABC: cmp r7, 0x2 bls _08097A68 bl DrawWholeMapView - ldr r4, _08097B40 @ =gUnknown_2039870 + ldr r4, _08097B40 @ =sCutGrassSpriteArrayPtr movs r0, 0x8 bl Alloc str r0, [r4] @@ -364,7 +229,7 @@ _08097AE2: .align 2, 0 _08097B38: .4byte gPlayerFacingPosition _08097B3C: .4byte 0x0000ffff -_08097B40: .4byte gUnknown_2039870 +_08097B40: .4byte sCutGrassSpriteArrayPtr _08097B44: .4byte gSprites _08097B48: .4byte gPlayerAvatar _08097B4C: .4byte gUnknown_83D414C @@ -485,7 +350,7 @@ sub_8097C18: @ 8097C18 push {r4-r6,lr} movs r4, 0x1 _08097C1C: - ldr r6, _08097C64 @ =gUnknown_2039870 + ldr r6, _08097C64 @ =sCutGrassSpriteArrayPtr ldr r0, [r6] adds r0, r4 ldrb r1, [r0] @@ -516,7 +381,7 @@ _08097C1C: pop {r0} bx r0 .align 2, 0 -_08097C64: .4byte gUnknown_2039870 +_08097C64: .4byte sCutGrassSpriteArrayPtr _08097C68: .4byte gSprites thumb_func_end sub_8097C18 diff --git a/include/field_specials.h b/include/field_specials.h index 02069ff84..b7d7f4f1d 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -25,5 +25,6 @@ bool8 ShouldShowBoxWasFullMessage(void); u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr); u8 GetUnlockedSeviiAreas(void); u32 GetPlayerTrainerId(void); +bool8 CutMoveRuinValleyCheck(void); #endif // GUARD_FIELD_SPECIALS_H diff --git a/include/fieldmap.h b/include/fieldmap.h index 406ec2959..a8e31685f 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -19,6 +19,7 @@ u32 MapGridGetMetatileBehaviorAt(int, int); u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y); void MapGridSetMetatileIdAt(int, int, u16); void MapGridSetMetatileEntryAt(int, int, u16); +u8 MapGridGetZCoordAt(s32 x, s32 y); void GetCameraCoords(u16*, u16*); bool8 MapGridIsImpassableAt(s32, s32); s32 GetMapBorderIdAt(s32, s32); @@ -29,8 +30,8 @@ struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y); void sub_8059948(u8 a0, u8 a1); void save_serialize_map(void); -u32 sub_8058F1C(u32 original, u8 bit); -u32 sub_8058F48(s16 x, s16 y, u8 z); +u32 GetMetatileAttributeFromRawMetatileBehavior(u32 original, u8 bit); +u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attr); void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2); #endif //GUARD_FIELDMAP_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index d567ab77c..f3195e6c9 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -114,7 +114,7 @@ bool8 MetatileBehavior_UnusedReturnFalse_10(u8 metatileBehavior); bool8 MetatileBehavior_UnusedReturnFalse_11(u8 metatileBehavior); bool8 MetatileBehavior_UnusedReturnFalse_12(u8 metatileBehavior); bool8 MetatileBehavior_UnusedReturnFalse_13(u8 metatileBehavior); -bool8 sub_805A2BC(u8 metatileBehavior, u8 playerDirection); +bool8 TestMetatileAttributeBit(u8 attr, u8 bitmask); bool8 MetatileBehavior_UnusedIsSpinRight(u8 metatileBehavior); bool8 MetatileBehavior_UnusedIsSpinLeft(u8 metatileBehavior); bool8 MetatileBehavior_UnusedIsSpinUp(u8 metatileBehavior); diff --git a/ld_script.txt b/ld_script.txt index 74607f92e..5d4bbf6f9 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -131,6 +131,7 @@ SECTIONS { asm/pokemon_storage_system.o(.text); src/pokemon_icon.o(.text); src/script_movement.o(.text); + src/fldeff_cut.o(.text); asm/fldeff_cut.o(.text); src/mail_data.o(.text); src/map_name_popup.o(.text); diff --git a/src/fieldmap.c b/src/fieldmap.c index 1f7d8b0b8..635f11af8 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -35,18 +35,18 @@ EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; const struct ConnectionFlags sDummyConnectionFlags = {}; -const u32 gUnknown_8352EF0[] = { - 0x1ff, - 0x3e00, - 0x3c000, - 0xfc0000, - 0x7000000, +const u32 sMetatileAttrMasks[] = { + 0x000001ff, + 0x00003e00, + 0x0003c000, + 0x00fc0000, + 0x07000000, 0x18000000, 0x60000000, 0x80000000 }; -const u8 gUnknown_8352F10[] = { +const u8 sMetatileAttrShifts[] = { 0, 9, 14, @@ -443,28 +443,28 @@ u32 MapGridGetMetatileIdAt(s32 x, s32 y) return block & 0x3FF; } -u32 sub_8058F1C(u32 original, u8 bit) +u32 GetMetatileAttributeFromRawMetatileBehavior(u32 original, u8 bit) { if (bit >= 8) return original; - return (original & gUnknown_8352EF0[bit]) >> gUnknown_8352F10[bit]; + return (original & sMetatileAttrMasks[bit]) >> sMetatileAttrShifts[bit]; } -u32 sub_8058F48(s16 x, s16 y, u8 z) +u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attr) { u16 metatileId = MapGridGetMetatileIdAt(x, y); - return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, z); + return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, attr); } u32 MapGridGetMetatileBehaviorAt(s32 x, s32 y) { - return sub_8058F48(x, y, 0); + return MapGridGetMetatileAttributeAt(x, y, 0); } u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y) { - return sub_8058F48(x, y, 6); + return MapGridGetMetatileAttributeAt(x, y, 6); } void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatile) @@ -512,12 +512,12 @@ u32 GetBehaviorByMetatileIdAndMapLayout(struct MapLayout *mapLayout, u16 metatil if (metatile < NUM_METATILES_IN_PRIMARY) { attributes = mapLayout->primaryTileset->metatileAttributes; - return sub_8058F1C(attributes[metatile], attr); + return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile], attr); } else if (metatile < 0x400) { attributes = mapLayout->secondaryTileset->metatileAttributes; - return sub_8058F1C(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr); + return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr); } else { diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c new file mode 100644 index 000000000..c30eb2d80 --- /dev/null +++ b/src/fldeff_cut.c @@ -0,0 +1,68 @@ +#include "global.h" +#include "gflib.h" +#include "fieldmap.h" +#include "field_specials.h" +#include "fldeff.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "metatile_behavior.h" +#include "party_menu.h" +#include "constants/event_objects.h" + +EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; +EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; + +void FieldCallback_CutTree(void); +void FieldCallback_CutGrass(void); + +u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) +{ + return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, 1), 1); +} + +bool8 SetUpFieldMove_Cut(void) +{ + s16 x, y; + u8 i, j; + sScheduleOpenDottedHole = FALSE; + if (CutMoveRuinValleyCheck() == TRUE) + { + sScheduleOpenDottedHole = TRUE; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + return TRUE; + } + + if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_CUT_TREE) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutTree; + return TRUE; + } + else + { + register s32 neg1 asm("r8"); + struct MapPosition *pos; + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + + for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++) + { + + y = i + neg1 + pos->y; + for (j = 0; j < 3; j++) + { + x = j + neg1 + pos->x; + if (MapGridGetZCoordAt(x, y) == pos->height) + { + if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + return TRUE; + } + } + } + } + return FALSE; + } +} diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 8e07c1c97..7c05d1dde 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -16,39 +16,12 @@ static const bool8 sTileSurfable[METATILE_COUNT] = { [MB_SOUTHWARD_CURRENT] = TRUE }; -static const u8 sTileBitAttributes[] = { - 0x00, - 0x01, - 0x02, - 0x04, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 +static const u8 sTileBitAttributes[32] = { + [0] = 0x00, + [1] = 0x01, + [2] = 0x02, + [3] = 0x04, + [4] = 0x08, }; bool8 MetatileBehavior_UnusedReturnTrue(u8 metatileBehavior) @@ -769,7 +742,7 @@ bool8 MetatileBehavior_UnusedReturnFalse_11(u8 metatileBehavior) { return FALSE; bool8 MetatileBehavior_UnusedReturnFalse_12(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnusedReturnFalse_13(u8 metatileBehavior) { return FALSE; } -bool8 sub_805A2BC(u8 arg1, u8 arg2) +bool8 TestMetatileAttributeBit(u8 arg1, u8 arg2) { if(sTileBitAttributes[arg1] & arg2) return TRUE; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b32eb583a..b3605db47 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -367,11 +367,11 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi headerId = GetCurrentMapWildMonHeaderId(); if (headerId != 0xFFFF) { - if (sub_8058F1C(currMetatileBehavior, 4) == TRUE) + if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == TRUE) { if (gWildMonHeaders[headerId].landMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) return FALSE; if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) { @@ -405,12 +405,12 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi } } } - else if (sub_8058F1C(currMetatileBehavior, 4) == 2 - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetatileBehavior, 0)) == TRUE)) + else if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == 2 + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0)) == TRUE)) { if (gWildMonHeaders[headerId].waterMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) return FALSE; else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) { @@ -474,7 +474,7 @@ bool8 SweetScentWildEncounter(void) headerId = GetCurrentMapWildMonHeaderId(); if (headerId != 0xFFFF) { - if (sub_8058F48(x, y, 4) == 1) + if (MapGridGetMetatileAttributeAt(x, y, 4) == 1) { if (TryStartRoamerEncounter() == TRUE) { @@ -490,7 +490,7 @@ bool8 SweetScentWildEncounter(void) BattleSetup_StartWildBattle(); return TRUE; } - else if (sub_8058F48(x, y, 4) == 2) + else if (MapGridGetMetatileAttributeAt(x, y, 4) == 2) { if (TryStartRoamerEncounter() == TRUE) { @@ -711,7 +711,7 @@ void ResetEncounterRateModifiers(void) static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior) { - u8 unk = sub_8058F1C(currMetatileBehavior, 4); + u8 unk = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4); u32 minSteps; u32 encRate; if (unk == 0) @@ -763,19 +763,19 @@ bool8 TryStandardWildEncounter(u32 currMetatileBehavior) { if (!HandleWildEncounterCooldown(currMetatileBehavior)) { - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return FALSE; } else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE) { sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.stepsSinceLastEncounter = 0; - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return TRUE; } else { - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return FALSE; } } diff --git a/sym_ewram.txt b/sym_ewram.txt index d358929eb..372b15b6a 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -220,10 +220,10 @@ gUnknown_203982C: @ 203982C .include "src/script_movement.o" .align 2 -gUnknown_2039870: @ 2039870 +sCutGrassSpriteArrayPtr: @ 2039870 .space 0x4 -gUnknown_2039874: @ 2039874 +sScheduleOpenDottedHole: @ 2039874 .space 0x4 .align 2 -- cgit v1.2.3 From 41644b283ad2d4fb5e30b61271c5820c1ccbc499 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 25 Feb 2020 16:52:16 -0500 Subject: through sub_8097A20 --- asm/fldeff_cut.s | 104 --------------------------------------------- include/event_scripts.h | 3 ++ include/field_specials.h | 1 + src/field_fadetransition.c | 7 +-- src/fldeff_cut.c | 44 ++++++++++++++++++- src/fldeff_rocksmash.c | 3 +- src/quest_log.c | 30 ++++++------- 7 files changed, 68 insertions(+), 124 deletions(-) diff --git a/asm/fldeff_cut.s b/asm/fldeff_cut.s index fa7a114ab..b3f94c1fd 100644 --- a/asm/fldeff_cut.s +++ b/asm/fldeff_cut.s @@ -5,110 +5,6 @@ .text - thumb_func_start FieldCallback_CutGrass -FieldCallback_CutGrass: @ 8097984 - push {lr} - movs r0, 0x1 - bl FieldEffectStart - bl GetCursorSelectionMonId - ldr r1, _0809799C @ =gFieldEffectArguments - lsls r0, 24 - lsrs r0, 24 - str r0, [r1] - pop {r0} - bx r0 - .align 2, 0 -_0809799C: .4byte gFieldEffectArguments - thumb_func_end FieldCallback_CutGrass - - thumb_func_start sub_80979A0 -sub_80979A0: @ 80979A0 - push {lr} - bl oei_task_add - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080979C8 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldr r2, _080979CC @ =sub_8097A20 - lsrs r0, r2, 16 - strh r0, [r1, 0x18] - strh r2, [r1, 0x1A] - movs r0, 0x12 - bl IncrementGameStat - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_080979C8: .4byte gTasks -_080979CC: .4byte sub_8097A20 - thumb_func_end sub_80979A0 - - thumb_func_start FieldCallback_CutTree -FieldCallback_CutTree: @ 80979D0 - push {lr} - bl GetCursorSelectionMonId - ldr r1, _080979E8 @ =gFieldEffectArguments - lsls r0, 24 - lsrs r0, 24 - str r0, [r1] - ldr r0, _080979EC @ =EventScript_FldEffCut - bl ScriptContext1_SetupScript - pop {r0} - bx r0 - .align 2, 0 -_080979E8: .4byte gFieldEffectArguments -_080979EC: .4byte EventScript_FldEffCut - thumb_func_end FieldCallback_CutTree - - thumb_func_start sub_80979F0 -sub_80979F0: @ 80979F0 - push {lr} - bl oei_task_add - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08097A18 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldr r2, _08097A1C @ =sub_8097C6C - lsrs r0, r2, 16 - strh r0, [r1, 0x18] - strh r2, [r1, 0x1A] - movs r0, 0x12 - bl IncrementGameStat - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_08097A18: .4byte gTasks -_08097A1C: .4byte sub_8097C6C - thumb_func_end sub_80979F0 - - thumb_func_start sub_8097A20 -sub_8097A20: @ 8097A20 - push {lr} - movs r0, 0x1 - bl FieldEffectActiveListRemove - ldr r0, _08097A38 @ =sScheduleOpenDottedHole - ldrb r0, [r0] - cmp r0, 0x1 - bne _08097A3C - bl CutMoveOpenDottedHoleDoor - b _08097A42 - .align 2, 0 -_08097A38: .4byte sScheduleOpenDottedHole -_08097A3C: - movs r0, 0x3A - bl FieldEffectStart -_08097A42: - pop {r0} - bx r0 - thumb_func_end sub_8097A20 - thumb_func_start sub_8097A48 sub_8097A48: @ 8097A48 push {r4-r7,lr} diff --git a/include/event_scripts.h b/include/event_scripts.h index f026cb57a..bf16ed2ec 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -1201,4 +1201,7 @@ extern const u8 Text_MonSentToBoxBillsBoxFull[]; extern const u8 EventScript_BagItemCanBeRegistered[]; +// fldeff_cut +extern const u8 EventScript_FldEffCut[]; + #endif //GUARD_EVENT_SCRIPTS_H diff --git a/include/field_specials.h b/include/field_specials.h index b7d7f4f1d..9653a9169 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -26,5 +26,6 @@ u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr); u8 GetUnlockedSeviiAreas(void); u32 GetPlayerTrainerId(void); bool8 CutMoveRuinValleyCheck(void); +void CutMoveOpenDottedHoleDoor(void); #endif // GUARD_FIELD_SPECIALS_H diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 6e937e026..16f691a2d 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -22,6 +22,7 @@ #include "event_object_lock.h" #include "start_menu.h" #include "constants/songs.h" +#include "constants/event_object_movement.h" static void sub_807DF4C(u8 a0); static void sub_807DFBC(u8 taskId); @@ -348,7 +349,7 @@ static void sub_807DFBC(u8 taskId) { PlayerGetDestCoords(&task->data[12], &task->data[13]); sub_807DCB0(TRUE); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 8; } break; @@ -372,7 +373,7 @@ static void sub_807DFBC(u8 taskId) if (sub_807E418()) { sub_807DCB0(TRUE); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 2; } break; @@ -752,7 +753,7 @@ static void sub_807E80C(u8 taskId) if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { ObjectEventClearAnimIfSpecialAnimActive(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)]); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 17); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_UP); task->data[0] = 2; } break; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index c30eb2d80..d79eec7a4 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -1,19 +1,24 @@ #include "global.h" #include "gflib.h" +#include "event_scripts.h" #include "fieldmap.h" #include "field_specials.h" #include "fldeff.h" #include "field_effect.h" #include "field_player_avatar.h" #include "metatile_behavior.h" +#include "overworld.h" #include "party_menu.h" +#include "script.h" #include "constants/event_objects.h" EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; -void FieldCallback_CutTree(void); void FieldCallback_CutGrass(void); +void FieldCallback_CutTree(void); +void sub_8097A20(void); +void sub_8097C6C(void); u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) { @@ -66,3 +71,40 @@ bool8 SetUpFieldMove_Cut(void) return FALSE; } } + +void FieldCallback_CutGrass(void) +{ + FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 sub_80979A0(void) +{ + u8 taskId = oei_task_add(); + FLDEFF_SET_FUNC_TO_DATA(sub_8097A20); + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +void FieldCallback_CutTree(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(EventScript_FldEffCut); +} + +bool8 sub_80979F0(void) +{ + u8 taskId = oei_task_add(); + FLDEFF_SET_FUNC_TO_DATA(sub_8097C6C); + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +void sub_8097A20(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); + if (sScheduleOpenDottedHole == TRUE) + CutMoveOpenDottedHoleDoor(); + else + FieldEffectStart(FLDEFF_CUT_GRASS); +} diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 058922f06..779e4b8f4 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -12,6 +12,7 @@ #include "event_object_movement.h" #include "constants/songs.h" #include "constants/event_objects.h" +#include "constants/event_object_movement.h" #include "constants/maps.h" static void task08_080C9820(u8 taskId); @@ -60,7 +61,7 @@ static void task08_080C9820(u8 taskId) else { sub_805CB70(); - ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], 0x45); + ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_UNKNOWN_STEP_45); gTasks[taskId].func = sub_80C98B0; } } diff --git a/src/quest_log.c b/src/quest_log.c index b747dd8b6..6e70ceea8 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -113,7 +113,7 @@ static EWRAM_DATA u16 *gUnknown_203AE90 = NULL; static EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0}; static EWRAM_DATA struct UnkStruct_203AE98 gUnknown_203AE98[32] = {0}; static EWRAM_DATA u16 sQuestLogIdx = 0; -static EWRAM_DATA u8 gUnknown_203AF9A[64][2] = {{0}}; +static EWRAM_DATA u8 sMovementScripts[64][2] = {{0}}; static EWRAM_DATA u16 gUnknown_203B01A = 0; static EWRAM_DATA u16 gUnknown_203B01C = 0; static EWRAM_DATA u16 sFlagOrVarPlayhead = 0; @@ -1551,24 +1551,24 @@ void sub_811246C(struct Sprite *sprite) struct ObjectEvent *objectEvent = &gObjectEvents[sprite->data[0]]; if (objectEvent->localId == OBJ_EVENT_ID_PLAYER) { - if (gUnknown_203AF9A[0][0] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[0][0] != 0xFF) { - ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[0][0]); - gUnknown_203AF9A[0][0] = OBJ_EVENT_ID_PLAYER; + ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]); + sMovementScripts[0][0] = 0xFF; } - if (gUnknown_203AF9A[0][1] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[0][1] != OBJ_EVENT_ID_PLAYER) { sub_8150454(); - gUnknown_203AF9A[0][1] = OBJ_EVENT_ID_PLAYER; + sMovementScripts[0][1] = OBJ_EVENT_ID_PLAYER; } sub_8063E28(objectEvent, sprite); } else { - if (gUnknown_203AF9A[objectEvent->localId][0] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[objectEvent->localId][0] != 0xFF) { - ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[objectEvent->localId][0]); - gUnknown_203AF9A[objectEvent->localId][0] = OBJ_EVENT_ID_PLAYER; + ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]); + sMovementScripts[objectEvent->localId][0] = 0xFF; } sub_8063E28(objectEvent, sprite); } @@ -1736,15 +1736,15 @@ static void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2) sNumQuestLogs = a2 / 8; for (i = 0; i < 0x40; i++) { - gUnknown_203AF9A[i][0] |= 0xFF; - gUnknown_203AF9A[i][1] |= 0xFF; + sMovementScripts[i][0] |= 0xFF; + sMovementScripts[i][1] |= 0xFF; } sQuestLogIdx = 0; gUnknown_203B01C = 0; gUnknown_3005E90 = (struct UnkStruct_3005E90){}; gUnknown_203B01A = gUnknown_3005E94[sQuestLogIdx].unk_4; - gUnknown_203AF9A[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; - gUnknown_203AF9A[0][1] = 0xFF; + sMovementScripts[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[0][1] = 0xFF; gUnknown_3005E88 = 1; break; case 2: @@ -1807,10 +1807,10 @@ void sub_8112B3C(void) switch (gUnknown_3005E94[sQuestLogIdx].unk_6) { case 0: - gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; break; case 1: - gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3; break; case 2: *(u32 *)&gUnknown_3005E90 = ((gUnknown_3005E94[sQuestLogIdx].unk_3 << 24) | (gUnknown_3005E94[sQuestLogIdx].unk_2 << 16) | (gUnknown_3005E94[sQuestLogIdx].unk_1 << 8) | (gUnknown_3005E94[sQuestLogIdx].unk_0 << 0)); -- cgit v1.2.3 From 51e2b99b9d748755b77fa3bdbc86d261d58fc74c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 26 Feb 2020 09:11:24 -0500 Subject: Finish fldeff_cut --- asm/fldeff_cut.s | 296 ---------------------------------------- data/fldeff_cut.s | 40 ------ include/event_object_movement.h | 4 + ld_script.txt | 3 +- src/fldeff_cut.c | 183 +++++++++++++++++++++++-- sym_ewram.txt | 8 +- 6 files changed, 179 insertions(+), 355 deletions(-) delete mode 100644 asm/fldeff_cut.s delete mode 100644 data/fldeff_cut.s diff --git a/asm/fldeff_cut.s b/asm/fldeff_cut.s deleted file mode 100644 index b3f94c1fd..000000000 --- a/asm/fldeff_cut.s +++ /dev/null @@ -1,296 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_8097A48 -sub_8097A48: @ 8097A48 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - movs r7, 0 - movs r0, 0x79 - bl PlaySE - ldr r4, _08097B38 @ =gPlayerFacingPosition - adds r1, r4, 0x2 - adds r0, r4, 0 - bl PlayerGetDestCoords - mov r8, r4 - ldr r0, _08097B3C @ =0x0000ffff - mov r9, r0 -_08097A68: - mov r1, r9 - adds r0, r1, r7 - mov r2, r8 - ldrh r2, [r2, 0x2] - adds r0, r2 - movs r6, 0 - lsls r0, 16 - asrs r5, r0, 16 -_08097A78: - mov r1, r9 - adds r0, r1, r6 - mov r2, r8 - ldrh r2, [r2] - adds r0, r2 - lsls r0, 16 - asrs r4, r0, 16 - adds r0, r4, 0 - adds r1, r5, 0 - bl MapGridGetZCoordAt - lsls r0, 24 - lsrs r0, 24 - mov r2, r8 - movs r1, 0x4 - ldrsb r1, [r2, r1] - cmp r0, r1 - bne _08097ABC - adds r0, r4, 0 - adds r1, r5, 0 - bl MetatileAtCoordsIsGrassTile - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08097ABC - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8097B50 - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_805F378 -_08097ABC: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x2 - bls _08097A78 - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0x2 - bls _08097A68 - bl DrawWholeMapView - ldr r4, _08097B40 @ =sCutGrassSpriteArrayPtr - movs r0, 0x8 - bl Alloc - str r0, [r4] - movs r7, 0 - ldr r5, _08097B44 @ =gSprites -_08097AE2: - ldr r0, _08097B48 @ =gPlayerAvatar - ldrb r1, [r0, 0x4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - ldrh r1, [r0, 0x2] - lsls r1, 23 - lsrs r1, 7 - movs r2, 0x80 - lsls r2, 12 - adds r1, r2 - asrs r1, 16 - ldrb r2, [r0] - adds r2, 0x14 - ldr r0, _08097B4C @ =gUnknown_83D414C - movs r3, 0 - bl CreateSprite - ldr r1, [r4] - adds r1, r7 - strb r0, [r1] - ldr r0, [r4] - adds r0, r7 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - lsls r1, r7, 5 - strh r1, [r0, 0x32] - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0x7 - bls _08097AE2 - movs r0, 0 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08097B38: .4byte gPlayerFacingPosition -_08097B3C: .4byte 0x0000ffff -_08097B40: .4byte sCutGrassSpriteArrayPtr -_08097B44: .4byte gSprites -_08097B48: .4byte gPlayerAvatar -_08097B4C: .4byte gUnknown_83D414C - thumb_func_end sub_8097A48 - - thumb_func_start sub_8097B50 -sub_8097B50: @ 8097B50 - push {r4-r7,lr} - lsls r0, 16 - lsls r1, 16 - movs r4, 0 - lsrs r6, r0, 16 - asrs r0, 16 - lsrs r7, r1, 16 - asrs r1, 16 - bl MapGridGetMetatileIdAt - lsls r0, 16 - lsrs r2, r0, 16 - ldr r1, _08097B84 @ =gUnknown_83D4100 - ldr r5, _08097B88 @ =0x0000ffff - mov r12, r1 -_08097B6E: - lsls r3, r4, 2 - adds r0, r3, r1 - ldrh r0, [r0] - cmp r0, r5 - beq _08097BA0 - cmp r0, r2 - beq _08097B8C - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - b _08097B6E - .align 2, 0 -_08097B84: .4byte gUnknown_83D4100 -_08097B88: .4byte 0x0000ffff -_08097B8C: - lsls r0, r6, 16 - asrs r0, 16 - lsls r1, r7, 16 - asrs r1, 16 - mov r2, r12 - adds r2, 0x2 - adds r2, r3, r2 - ldrh r2, [r2] - bl MapGridSetMetatileIdAt -_08097BA0: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8097B50 - - thumb_func_start objc_8097BA8 -objc_8097BA8: @ 8097BA8 - movs r2, 0 - movs r1, 0x8 - strh r1, [r0, 0x2E] - strh r2, [r0, 0x30] - strh r2, [r0, 0x34] - ldr r1, _08097BB8 @ =objc_8097BBC - str r1, [r0, 0x1C] - bx lr - .align 2, 0 -_08097BB8: .4byte objc_8097BBC - thumb_func_end objc_8097BA8 - - thumb_func_start objc_8097BBC -objc_8097BBC: @ 8097BBC - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x32 - ldrsh r0, [r4, r1] - movs r2, 0x2E - ldrsh r1, [r4, r2] - bl Sin - strh r0, [r4, 0x24] - movs r1, 0x32 - ldrsh r0, [r4, r1] - movs r2, 0x2E - ldrsh r1, [r4, r2] - bl Cos - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x32] - adds r0, 0x8 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x32] - ldrh r1, [r4, 0x2E] - adds r1, 0x1 - ldrh r2, [r4, 0x34] - lsls r0, r2, 16 - asrs r0, 18 - adds r1, r0 - strh r1, [r4, 0x2E] - adds r2, 0x1 - strh r2, [r4, 0x34] - ldrh r1, [r4, 0x30] - movs r2, 0x30 - ldrsh r0, [r4, r2] - cmp r0, 0x1C - beq _08097C08 - adds r0, r1, 0x1 - strh r0, [r4, 0x30] - b _08097C0C -_08097C08: - ldr r0, _08097C14 @ =sub_8097C18 - str r0, [r4, 0x1C] -_08097C0C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08097C14: .4byte sub_8097C18 - thumb_func_end objc_8097BBC - - thumb_func_start sub_8097C18 -sub_8097C18: @ 8097C18 - push {r4-r6,lr} - movs r4, 0x1 -_08097C1C: - ldr r6, _08097C64 @ =sCutGrassSpriteArrayPtr - ldr r0, [r6] - adds r0, r4 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r5, _08097C68 @ =gSprites - adds r0, r5 - bl DestroySprite - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x7 - bls _08097C1C - ldr r0, [r6] - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - movs r1, 0x3A - bl FieldEffectStop - ldr r0, [r6] - bl Free - bl sub_80696C0 - bl ScriptContext2_Disable - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08097C64: .4byte sCutGrassSpriteArrayPtr -_08097C68: .4byte gSprites - thumb_func_end sub_8097C18 - - thumb_func_start sub_8097C6C -sub_8097C6C: @ 8097C6C - push {lr} - movs r0, 0x79 - bl PlaySE - movs r0, 0x2 - bl FieldEffectActiveListRemove - bl EnableBothScriptContexts - pop {r0} - bx r0 - thumb_func_end sub_8097C6C - - .align 2, 0 @ Don't pad with nop. diff --git a/data/fldeff_cut.s b/data/fldeff_cut.s deleted file mode 100644 index ca25b396a..000000000 --- a/data/fldeff_cut.s +++ /dev/null @@ -1,40 +0,0 @@ -#include "constants/maps.h" -#include "constants/species.h" - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnknown_83D4100:: @ 83D4100 - .2byte 0x000d, 0x0001 - .2byte 0x000a, 0x0013 - .2byte 0x000b, 0x000e - .2byte 0x000c, 0x000f - .2byte 0x0352, 0x033e - .2byte 0x0300, 0x0310 - .2byte 0x0301, 0x0311 - .2byte 0x0302, 0x0312 - .2byte 0x0284, 0x0281 - .2byte 0xffff, 0xffff - - .align 2 -gOamData_83D4128:: - .4byte 0x00000000, 0x00001401 - -gAnimCmd_83D4130:: - obj_image_anim_frame 0, 30 - obj_image_anim_jump 0 - -gSpriteAnimTable_83D4138:: - .4byte gAnimCmd_83D4130 - -gUnknown_83D413C:: - obj_frame_tiles gUnknown_8398648, 0x20 - -gUnknown_83D4144:: - obj_pal gUnknown_8398688, 4096 - -gUnknown_83D414C:: @ 83D414C - spr_template 0xFFFF, 4096, gOamData_83D4128, gSpriteAnimTable_83D4138, gUnknown_83D413C, gDummySpriteAffineAnimTable, objc_8097BA8 - diff --git a/include/event_object_movement.h b/include/event_object_movement.h index b713dbd7d..baf66d737 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -117,6 +117,8 @@ bool32 RfuUnionObjectIsInvisible(u8 objectEventId); void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo); bool32 RfuUnionObjectIsWarping(u8 objectEventId); +void sub_805F378(s16 x, s16 y); + // Exported data declarations extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; @@ -124,5 +126,7 @@ extern const struct SpritePalette gUnknown_83A5348; extern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[]; extern const struct OamData gObjectEventBaseOam_32x32; extern const struct UCoords16 gUnknown_83A64C8[]; +extern const u16 gUnknown_8398648[]; +extern const u16 gUnknown_8398688[]; #endif // GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/ld_script.txt b/ld_script.txt index 5d4bbf6f9..4bd983bfc 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -132,7 +132,6 @@ SECTIONS { src/pokemon_icon.o(.text); src/script_movement.o(.text); src/fldeff_cut.o(.text); - asm/fldeff_cut.o(.text); src/mail_data.o(.text); src/map_name_popup.o(.text); src/item_menu_icons.o(.text); @@ -450,7 +449,7 @@ SECTIONS { src/trainer_card.o(.rodata); data/pokemon_storage_system.o(.rodata); src/pokemon_icon.o(.rodata); - data/fldeff_cut.o(.rodata); + src/fldeff_cut.o(.rodata); src/map_name_popup.o(.rodata); src/item_menu_icons.o(.rodata); src/battle_anim_mon_movement.o(.rodata); diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index d79eec7a4..d7ed12fc1 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -1,7 +1,10 @@ #include "global.h" #include "gflib.h" +#include "event_object_lock.h" +#include "event_object_movement.h" #include "event_scripts.h" #include "fieldmap.h" +#include "field_camera.h" #include "field_specials.h" #include "fldeff.h" #include "field_effect.h" @@ -10,17 +13,79 @@ #include "overworld.h" #include "party_menu.h" #include "script.h" +#include "trig.h" #include "constants/event_objects.h" +#include "constants/songs.h" -EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; -EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; +static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; +static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; -void FieldCallback_CutGrass(void); -void FieldCallback_CutTree(void); -void sub_8097A20(void); -void sub_8097C6C(void); +static void FieldCallback_CutGrass(void); +static void FieldCallback_CutTree(void); +static void sub_8097A20(void); +static void sub_8097B50(s16 x, s16 y); +static void objc_8097BA8(struct Sprite * sprite); +static void objc_8097BBC(struct Sprite * sprite); +static void sub_8097C18(struct Sprite * sprite); +static void sub_8097C6C(void); -u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) +static const u16 sCutGrassMetatileMapping[][2] = { + {0x000d, 0x0001}, + {0x000a, 0x0013}, + {0x000b, 0x000e}, + {0x000c, 0x000f}, + {0x0352, 0x033e}, + {0x0300, 0x0310}, + {0x0301, 0x0311}, + {0x0302, 0x0312}, + {0x0284, 0x0281}, + {0xffff, 0xffff} +}; + +static const struct OamData gOamData_83D4128 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0x001, + .priority = 1, + .paletteNum = 0x1, + .affineParam = 0 +}; + +static const union AnimCmd gAnimCmd_83D4130[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gSpriteAnimTable_83D4138[] = { + gAnimCmd_83D4130 +}; + +static const struct SpriteFrameImage gUnknown_83D413C[] = { + {gUnknown_8398648, 0x20} +}; + +const struct SpritePalette gUnknown_83D4144[] = { + gUnknown_8398688, 4096 +}; + +static const struct SpriteTemplate sSpriteTemplate_CutGrass = { + .tileTag = 0xFFFF, + .paletteTag = 4096, + .oam = &gOamData_83D4128, + .anims = gSpriteAnimTable_83D4138, + .images = gUnknown_83D413C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = objc_8097BA8 +}; + +static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) { return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, 1), 1); } @@ -72,7 +137,7 @@ bool8 SetUpFieldMove_Cut(void) } } -void FieldCallback_CutGrass(void) +static void FieldCallback_CutGrass(void) { FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); gFieldEffectArguments[0] = GetCursorSelectionMonId(); @@ -86,7 +151,7 @@ bool8 sub_80979A0(void) return FALSE; } -void FieldCallback_CutTree(void) +static void FieldCallback_CutTree(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext1_SetupScript(EventScript_FldEffCut); @@ -100,7 +165,7 @@ bool8 sub_80979F0(void) return FALSE; } -void sub_8097A20(void) +static void sub_8097A20(void) { FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); if (sScheduleOpenDottedHole == TRUE) @@ -108,3 +173,101 @@ void sub_8097A20(void) else FieldEffectStart(FLDEFF_CUT_GRASS); } + +bool8 sub_8097A48(void) +{ + u8 i, j; + s16 x, y; + register s32 neg1 asm("r9"); + struct MapPosition *pos; + + i = 0; + PlaySE(SE_W015); + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + + for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++) + { + + y = i + neg1 + pos->y; + for (j = 0; j < 3; j++) + { + x = j + neg1 + pos->x; + if (MapGridGetZCoordAt(x, y) == pos->height) + { + if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) + { + sub_8097B50(x, y); + sub_805F378(x, y); + } + } + } + } + DrawWholeMapView(); + sCutGrassSpriteArrayPtr = Alloc(8); + for (i = 0; i < 8; i++) + { + sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * 32; + } + return FALSE; +} + +static void sub_8097B50(s16 x, s16 y) +{ + u16 i = 0; + u16 metatileId = MapGridGetMetatileIdAt(x, y); + while (1) + { + if (sCutGrassMetatileMapping[i][0] == 0xFFFF) + return; + if (sCutGrassMetatileMapping[i][0] == metatileId) + { + MapGridSetMetatileIdAt(x, y, sCutGrassMetatileMapping[i][1]); + break; + } + i++; + } +} + +static void objc_8097BA8(struct Sprite * sprite) +{ + sprite->data[0] = 8; + sprite->data[1] = 0; + sprite->data[3] = 0; + sprite->callback = objc_8097BBC; +} + +static void objc_8097BBC(struct Sprite * sprite) +{ + sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); + sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); + sprite->data[2] += 8; + sprite->data[2] &= 0xFF; + sprite->data[0]++; + sprite->data[0] += sprite->data[3] >> 2; + sprite->data[3]++; + if (sprite->data[1] != 28) + sprite->data[1]++; + else + sprite->callback = sub_8097C18; +} + +static void sub_8097C18(struct Sprite * sprite) +{ + u8 i; + for (i = 1; i < 8; i++) + { + DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]); + } + FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS); + Free(sCutGrassSpriteArrayPtr); + sub_80696C0(); + ScriptContext2_Disable(); +} + +static void sub_8097C6C(void) +{ + PlaySE(SE_W015); + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); + EnableBothScriptContexts(); +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 372b15b6a..856d5d9e0 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -218,14 +218,8 @@ gUnknown_203982C: @ 203982C .align 2 .include "src/script_movement.o" - .align 2 -sCutGrassSpriteArrayPtr: @ 2039870 - .space 0x4 - -sScheduleOpenDottedHole: @ 2039874 - .space 0x4 - + .include "src/fldeff_cut.o" .align 2 .include "src/item_menu_icons.o" -- cgit v1.2.3 From 4747fcb6296709bf3f9eb287ca6adb977dae0bce Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 26 Feb 2020 09:21:49 -0500 Subject: Name methods in fldeff_cut --- asm/fldeff_flash.s | 2 +- data/field_effect_scripts.s | 6 ++-- include/fldeff.h | 2 +- src/fldeff_cut.c | 70 +++++++++++++++++++++++---------------------- src/fldeff_dig.c | 2 +- src/fldeff_rocksmash.c | 41 +++++++++++++------------- src/fldeff_strength.c | 2 +- src/fldeff_sweetscent.c | 2 +- src/fldeff_teleport.c | 2 +- 9 files changed, 66 insertions(+), 63 deletions(-) diff --git a/asm/fldeff_flash.s b/asm/fldeff_flash.s index f550d2291..c6cc17f82 100644 --- a/asm/fldeff_flash.s +++ b/asm/fldeff_flash.s @@ -42,7 +42,7 @@ _080C9B6E: thumb_func_start sub_80C9B74 sub_80C9B74: @ 80C9B74 push {r4,lr} - bl oei_task_add + bl CreateFieldEffectShowMon adds r4, r0, 0 lsls r4, 24 lsrs r4, 24 diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index de50ed39d..cac76bea9 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -78,11 +78,11 @@ gFldEffScript_ExclamationMarkIcon:: @ 81D97C4 end gFldEffScript_UseCutOnGrass:: @ 81D97CA - callnative sub_80979A0 + callnative FldEff_UseCutOnGrass end gFldEffScript_UseCutOnTree:: @ 81D97D0 - callnative sub_80979F0 + callnative FldEff_UseCutOnTree end gFldEffScript_Shadow:: @ 81D97D6 @@ -299,7 +299,7 @@ gFldEffScript_SecretPowerShrub:: @ 81D9964 end gFldEffScript_CutGrass:: @ 81D9965 - loadfadedpal_callnative gUnknown_83D4144, sub_8097A48 + loadfadedpal_callnative gFldEffPalette_CutGrass, FldEff_CutGrass end gFldEffScript_FieldMoveShowMonInit:: @ 81D996F diff --git a/include/fldeff.h b/include/fldeff.h index 51287f400..56e2dfbd9 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -10,7 +10,7 @@ gTasks[taskId].data[9] = (u32)func; extern struct MapPosition gPlayerFacingPosition; bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId); -u8 oei_task_add(void); +u8 CreateFieldEffectShowMon(void); // flash u8 sub_80C9DCC(u8 lightLevel, u8 mapType); diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index d7ed12fc1..bf87bbc06 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -22,12 +22,12 @@ static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; static void FieldCallback_CutGrass(void); static void FieldCallback_CutTree(void); -static void sub_8097A20(void); -static void sub_8097B50(s16 x, s16 y); -static void objc_8097BA8(struct Sprite * sprite); -static void objc_8097BBC(struct Sprite * sprite); -static void sub_8097C18(struct Sprite * sprite); -static void sub_8097C6C(void); +static void FieldMoveCallback_CutGrass(void); +static void SetCutGrassMetatileAt(s16 x, s16 y); +static void SpriteCallback_CutGrass_Init(struct Sprite * sprite); +static void SpriteCallback_CutGrass_Run(struct Sprite * sprite); +static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite); +static void FieldMoveCallback_CutTree(void); static const u16 sCutGrassMetatileMapping[][2] = { {0x000d, 0x0001}, @@ -42,7 +42,7 @@ static const u16 sCutGrassMetatileMapping[][2] = { {0xffff, 0xffff} }; -static const struct OamData gOamData_83D4128 = { +static const struct OamData sOamData_FldEff_CutGrass = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -58,31 +58,31 @@ static const struct OamData gOamData_83D4128 = { .affineParam = 0 }; -static const union AnimCmd gAnimCmd_83D4130[] = { +static const union AnimCmd sSpriteAnim_Fldeff_CutGrass_0[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const gSpriteAnimTable_83D4138[] = { - gAnimCmd_83D4130 +static const union AnimCmd *const sSpriteAnimTable_FldEff_CutGrass[] = { + sSpriteAnim_Fldeff_CutGrass_0 }; -static const struct SpriteFrameImage gUnknown_83D413C[] = { +static const struct SpriteFrameImage sSpriteFrameImages_FldEff_CutGrass[] = { {gUnknown_8398648, 0x20} }; -const struct SpritePalette gUnknown_83D4144[] = { +const struct SpritePalette gFldEffPalette_CutGrass[] = { gUnknown_8398688, 4096 }; -static const struct SpriteTemplate sSpriteTemplate_CutGrass = { +static const struct SpriteTemplate sSpriteTemplate_FldEff_CutGrass = { .tileTag = 0xFFFF, .paletteTag = 4096, - .oam = &gOamData_83D4128, - .anims = gSpriteAnimTable_83D4138, - .images = gUnknown_83D413C, + .oam = &sOamData_FldEff_CutGrass, + .anims = sSpriteAnimTable_FldEff_CutGrass, + .images = sSpriteFrameImages_FldEff_CutGrass, .affineAnims = gDummySpriteAffineAnimTable, - .callback = objc_8097BA8 + .callback = SpriteCallback_CutGrass_Init }; static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) @@ -111,6 +111,7 @@ bool8 SetUpFieldMove_Cut(void) } else { + // FIXME: this fakematch register s32 neg1 asm("r8"); struct MapPosition *pos; PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); @@ -143,10 +144,10 @@ static void FieldCallback_CutGrass(void) gFieldEffectArguments[0] = GetCursorSelectionMonId(); } -bool8 sub_80979A0(void) +bool8 FldEff_UseCutOnGrass(void) { - u8 taskId = oei_task_add(); - FLDEFF_SET_FUNC_TO_DATA(sub_8097A20); + u8 taskId = CreateFieldEffectShowMon(); + FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutGrass); IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } @@ -157,15 +158,15 @@ static void FieldCallback_CutTree(void) ScriptContext1_SetupScript(EventScript_FldEffCut); } -bool8 sub_80979F0(void) +bool8 FldEff_UseCutOnTree(void) { - u8 taskId = oei_task_add(); - FLDEFF_SET_FUNC_TO_DATA(sub_8097C6C); + u8 taskId = CreateFieldEffectShowMon(); + FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutTree); IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } -static void sub_8097A20(void) +static void FieldMoveCallback_CutGrass(void) { FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); if (sScheduleOpenDottedHole == TRUE) @@ -174,10 +175,11 @@ static void sub_8097A20(void) FieldEffectStart(FLDEFF_CUT_GRASS); } -bool8 sub_8097A48(void) +bool8 FldEff_CutGrass(void) { u8 i, j; s16 x, y; + // FIXME: this fakematch register s32 neg1 asm("r9"); struct MapPosition *pos; @@ -196,7 +198,7 @@ bool8 sub_8097A48(void) { if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) { - sub_8097B50(x, y); + SetCutGrassMetatileAt(x, y); sub_805F378(x, y); } } @@ -206,13 +208,13 @@ bool8 sub_8097A48(void) sCutGrassSpriteArrayPtr = Alloc(8); for (i = 0; i < 8; i++) { - sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * 32; } return FALSE; } -static void sub_8097B50(s16 x, s16 y) +static void SetCutGrassMetatileAt(s16 x, s16 y) { u16 i = 0; u16 metatileId = MapGridGetMetatileIdAt(x, y); @@ -229,15 +231,15 @@ static void sub_8097B50(s16 x, s16 y) } } -static void objc_8097BA8(struct Sprite * sprite) +static void SpriteCallback_CutGrass_Init(struct Sprite * sprite) { sprite->data[0] = 8; sprite->data[1] = 0; sprite->data[3] = 0; - sprite->callback = objc_8097BBC; + sprite->callback = SpriteCallback_CutGrass_Run; } -static void objc_8097BBC(struct Sprite * sprite) +static void SpriteCallback_CutGrass_Run(struct Sprite * sprite) { sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); @@ -249,10 +251,10 @@ static void objc_8097BBC(struct Sprite * sprite) if (sprite->data[1] != 28) sprite->data[1]++; else - sprite->callback = sub_8097C18; + sprite->callback = SpriteCallback_CutGrass_Cleanup; } -static void sub_8097C18(struct Sprite * sprite) +static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite) { u8 i; for (i = 1; i < 8; i++) @@ -265,7 +267,7 @@ static void sub_8097C18(struct Sprite * sprite) ScriptContext2_Disable(); } -static void sub_8097C6C(void) +static void FieldMoveCallback_CutTree(void) { PlaySE(SE_W015); FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c index 9e1686468..0eb0d3c1e 100644 --- a/src/fldeff_dig.c +++ b/src/fldeff_dig.c @@ -29,7 +29,7 @@ static void FieldCallback_Dig(void) bool8 FldEff_UseDig(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 779e4b8f4..397741806 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -15,10 +15,10 @@ #include "constants/event_object_movement.h" #include "constants/maps.h" -static void task08_080C9820(u8 taskId); -static void sub_80C98FC(u8 taskId); -static void sub_80C98B0(u8 taskId); -static void sub_80C99A0(u8 taskId); +static void Task_FieldEffectShowMon_Init(u8 taskId); +static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId); +static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId); +static void Task_FieldEffectShowMon_Cleanup(u8 taskId); static void sub_80C9A10(void); static void sub_80C9A60(void); @@ -37,13 +37,13 @@ bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId) return TRUE; } -u8 oei_task_add(void) +u8 CreateFieldEffectShowMon(void) { GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); - return CreateTask(task08_080C9820, 8); + return CreateTask(Task_FieldEffectShowMon_Init, 8); } -static void task08_080C9820(u8 taskId) +static void Task_FieldEffectShowMon_Init(u8 taskId) { u8 mapObjId; @@ -55,48 +55,49 @@ static void task08_080C9820(u8 taskId) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) { + // Leftover from RS, inhibits the player anim while underwater. FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_80C98FC; + gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } else { sub_805CB70(); ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_UNKNOWN_STEP_45); - gTasks[taskId].func = sub_80C98B0; + gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim; } } } -static void sub_80C98B0(u8 taskId) +static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId) { if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]) == TRUE) { FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_80C98FC; + gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } } -static void sub_80C98FC(u8 taskId) +static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { gFieldEffectArguments[1] = GetPlayerFacingDirection(); - if (gFieldEffectArguments[1] == 1) + if (gFieldEffectArguments[1] == DIR_SOUTH) gFieldEffectArguments[2] = 0; - if (gFieldEffectArguments[1] == 2) + if (gFieldEffectArguments[1] == DIR_NORTH) gFieldEffectArguments[2] = 1; - if (gFieldEffectArguments[1] == 3) + if (gFieldEffectArguments[1] == DIR_WEST) gFieldEffectArguments[2] = 2; - if (gFieldEffectArguments[1] == 4) + if (gFieldEffectArguments[1] == DIR_EAST) gFieldEffectArguments[2] = 3; ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState()); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); - FieldEffectActiveListRemove(6); - gTasks[taskId].func = sub_80C99A0; + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + gTasks[taskId].func = Task_FieldEffectShowMon_Cleanup; } } -static void sub_80C99A0(u8 taskId) +static void Task_FieldEffectShowMon_Cleanup(u8 taskId) { FLDEFF_CALL_FUNC_IN_DATA(); gPlayerAvatar.unk6 = FALSE; @@ -122,7 +123,7 @@ static void sub_80C9A10(void) bool8 FldEff_UseRockSmash(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60); IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index 230b9c751..712d9f1c6 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -33,7 +33,7 @@ static void FldEff_UseStrength(void) bool8 sub_80D0860(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8); GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); return FALSE; diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 45c471e95..d827aff4d 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -43,7 +43,7 @@ bool8 FldEff_SweetScent(void) u8 taskId; SetWeatherScreenFadeOut(); - taskId = oei_task_add(); + taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect); return FALSE; } diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index a66a332bf..44a7af732 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -28,7 +28,7 @@ static void FieldCallback_Teleport(void) bool8 FldEff_UseTeleport(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); return FALSE; -- cgit v1.2.3 From 933bc3c01ab3e77c5f18770a8893e3424259ce77 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 26 Feb 2020 11:17:10 -0500 Subject: fieldmap.c static symbols; CUT_GRASS_SPRITE_COUNT --- src/fieldmap.c | 74 ++++++++++++++++++++++++++++---------------------------- src/fldeff_cut.c | 8 +++--- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/fieldmap.c b/src/fieldmap.c index 635f11af8..60ff70f10 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -16,26 +16,26 @@ struct ConnectionFlags }; static void InitMapLayoutData(struct MapHeader *mapHeader); -void map_copy_with_padding(u16 *map, u16 width, u16 height); -void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader); -void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void LoadSavedMapView(void); -struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y); -bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection); -bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset); +static void map_copy_with_padding(u16 *map, u16 width, u16 height); +static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader); +static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void LoadSavedMapView(void); +static struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y); +static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection); +static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset); struct BackupMapLayout VMap; -EWRAM_DATA u16 gBackupMapLayout[VIRTUAL_MAP_SIZE] = {}; +static EWRAM_DATA u16 gBackupMapLayout[VIRTUAL_MAP_SIZE] = {}; EWRAM_DATA struct MapHeader gMapHeader = {}; EWRAM_DATA struct Camera gCamera = {}; -EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; +static EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; -const struct ConnectionFlags sDummyConnectionFlags = {}; +static const struct ConnectionFlags sDummyConnectionFlags = {}; -const u32 sMetatileAttrMasks[] = { +static const u32 sMetatileAttrMasks[] = { 0x000001ff, 0x00003e00, 0x0003c000, @@ -46,7 +46,7 @@ const u32 sMetatileAttrMasks[] = { 0x80000000 }; -const u8 sMetatileAttrShifts[] = { +static const u8 sMetatileAttrShifts[] = { 0, 9, 14, @@ -87,7 +87,7 @@ static void InitMapLayoutData(struct MapHeader * mapHeader) mapheader_copy_mapdata_of_adjacent_maps(mapHeader); } -void map_copy_with_padding(u16 *map, u16 width, u16 height) +static void map_copy_with_padding(u16 *map, u16 width, u16 height) { s32 y; u16 *dest = VMap.map; @@ -101,7 +101,7 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height) } } -void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) +static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) { s32 count; struct MapConnection *connection; @@ -147,7 +147,7 @@ void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) } } -void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height) +static void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height) { s32 i; u16 *src; @@ -166,7 +166,7 @@ void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x } } -void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 x2; @@ -213,7 +213,7 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x; s32 x2, y2; @@ -262,7 +262,7 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 y; s32 x2, y2; @@ -308,7 +308,7 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons } } -void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 y2; @@ -544,7 +544,7 @@ void save_serialize_map(void) } } -bool32 SavedMapViewIsEmpty(void) +static bool32 SavedMapViewIsEmpty(void) { u16 i; u32 marker = 0; @@ -559,12 +559,12 @@ bool32 SavedMapViewIsEmpty(void) return FALSE; } -void ClearSavedMapView(void) +static void ClearSavedMapView(void) { CpuFill16(0, gSaveBlock2Ptr->mapView, sizeof(gSaveBlock2Ptr->mapView)); } -void LoadSavedMapView(void) +static void LoadSavedMapView(void) { s32 i, j; s32 x, y; @@ -588,7 +588,7 @@ void LoadSavedMapView(void) } } -void sub_8059250(u8 a1) +static void sub_8059250(u8 a1) { s32 width; u16 *mapView; @@ -690,7 +690,7 @@ s32 GetMapBorderIdAt(s32 x, s32 y) return 0; } -s32 GetPostCameraMoveMapBorderId(s32 x, s32 y) +static s32 GetPostCameraMoveMapBorderId(s32 x, s32 y) { return GetMapBorderIdAt(7 + gSaveBlock1Ptr->pos.x + x, 7 + gSaveBlock1Ptr->pos.y + y); } @@ -708,7 +708,7 @@ bool32 CanCameraMoveInDirection(s32 direction) return TRUE; } -void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y) +static void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -779,7 +779,7 @@ struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y) } -bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) +static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -795,7 +795,7 @@ bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) return FALSE; } -bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) +static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) { s32 offset2 = max(offset, 0); @@ -808,7 +808,7 @@ bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) return FALSE; } -bool32 sub_80596E8(s32 x, s32 width) +static bool32 sub_80596E8(s32 x, s32 width) { if (x >= 0 && x < width) return TRUE; @@ -816,7 +816,7 @@ bool32 sub_80596E8(s32 x, s32 width) return FALSE; } -s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y) +static s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -878,7 +878,7 @@ void GetCameraFocusCoords(u16 *x, u16 *y) *y = gSaveBlock1Ptr->pos.y + 7; } -void SetCameraCoords(u16 x, u16 y) +static void SetCameraCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x; gSaveBlock1Ptr->pos.y = y; @@ -889,7 +889,7 @@ void GetCameraCoords(u16 *x, u16 *y) *x = gSaveBlock1Ptr->pos.x; *y = gSaveBlock1Ptr->pos.y; } -void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset) +static void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { @@ -900,7 +900,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, } } -void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset) +static void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { @@ -911,7 +911,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, } } -void sub_80598CC(u16 a0, u16 a1) +static void sub_80598CC(u16 a0, u16 a1) { switch (gUnknown_2036E28) { @@ -955,7 +955,7 @@ void sub_8059948(u8 a0, u8 a1) CpuFastCopy(gPlttBufferUnfaded + a0 * 16, gPlttBufferFaded + a0 * 16, a1 * 16 * sizeof(u16)); } -void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) +static void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) { u16 black = RGB_BLACK; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index bf87bbc06..64165ae8f 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -17,6 +17,8 @@ #include "constants/event_objects.h" #include "constants/songs.h" +#define CUT_GRASS_SPRITE_COUNT 8 + static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; @@ -205,11 +207,11 @@ bool8 FldEff_CutGrass(void) } } DrawWholeMapView(); - sCutGrassSpriteArrayPtr = Alloc(8); + sCutGrassSpriteArrayPtr = Alloc(CUT_GRASS_SPRITE_COUNT); for (i = 0; i < 8; i++) { sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); - gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * 32; + gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * (0x100 / CUT_GRASS_SPRITE_COUNT); } return FALSE; } @@ -257,7 +259,7 @@ static void SpriteCallback_CutGrass_Run(struct Sprite * sprite) static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite) { u8 i; - for (i = 1; i < 8; i++) + for (i = 1; i < CUT_GRASS_SPRITE_COUNT; i++) { DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]); } -- cgit v1.2.3 From cac0681b2c11b7184545cc42d4bd209d6000b42c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 26 Feb 2020 13:14:53 -0500 Subject: Name cut grass metatiles --- include/constants/metatile_labels.h | 24 +++++++++++++++++++++ include/global.fieldmap.h | 2 ++ src/fldeff_cut.c | 42 ++++++++++++++++++++++++++++--------- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h index b71e7d08f..ca4a92263 100644 --- a/include/constants/metatile_labels.h +++ b/include/constants/metatile_labels.h @@ -2,6 +2,14 @@ #define GUARD_METATILE_LABELS_H // gTileset_General +#define METATILE_General_Plain_Mowed 0x001 +#define METATILE_General_ThinTreeTop_Grass 0x00A +#define METATILE_General_WideTreeTopLeft_Grass 0x00B +#define METATILE_General_WideTreeTopRight_Grass 0x00C +#define METATILE_General_Plain_Grass 0x00D +#define METATILE_General_WideTreeTopLeft_Mowed 0x00E +#define METATILE_General_WideTreeTopRight_Mowed 0x00F +#define METATILE_General_ThinTreeTop_Mowed 0x013 #define METATILE_General_CalmWater 0x12B // gTileset_Mart @@ -127,4 +135,20 @@ #define METATILE_TrainerTower_Floor_ShadeBottomLeft 0x287 #define METATILE_TrainerTower_CounterBarrier 0x2B4 +// gTileset_ViridianForest +#define METATILE_ViridianForest_HugeTreeTopMiddle_Grass 0x284 +#define METATILE_ViridianForest_HugeTreeTopMiddle_Mowed 0x281 + +// gTileset_CeladonCity +#define METATILE_CeladonCity_CyclingRoad_Grass 0x352 +#define METATILE_CeladonCity_CyclingRoad_Mowed 0x33E + +// gTileset_FuchsiaCity +#define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Grass 0x300 +#define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Grass 0x301 +#define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Grass 0x302 +#define METATILE_FuchsiaCity_SafariZoneTreeTopLeft_Mowed 0x310 +#define METATILE_FuchsiaCity_SafariZoneTreeTopMiddle_Mowed 0x311 +#define METATILE_FuchsiaCity_SafariZoneTreeTopRight_Mowed 0x312 + #endif // GUARD_METATILE_LABELS_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index c599b68ab..a4d6880b1 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -15,6 +15,8 @@ enum typedef void (*TilesetCB)(void); +#define METATILE_ID(tileset, name) (METATILE_##tileset##_##name) + struct Tileset { /*0x00*/ bool8 isCompressed; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index 64165ae8f..8617a1aaa 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -16,6 +16,7 @@ #include "trig.h" #include "constants/event_objects.h" #include "constants/songs.h" +#include "constants/metatile_labels.h" #define CUT_GRASS_SPRITE_COUNT 8 @@ -32,16 +33,37 @@ static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite); static void FieldMoveCallback_CutTree(void); static const u16 sCutGrassMetatileMapping[][2] = { - {0x000d, 0x0001}, - {0x000a, 0x0013}, - {0x000b, 0x000e}, - {0x000c, 0x000f}, - {0x0352, 0x033e}, - {0x0300, 0x0310}, - {0x0301, 0x0311}, - {0x0302, 0x0312}, - {0x0284, 0x0281}, - {0xffff, 0xffff} + { + METATILE_ID(General, Plain_Grass), + METATILE_ID(General, Plain_Mowed) + }, { + METATILE_ID(General, ThinTreeTop_Grass), + METATILE_ID(General, ThinTreeTop_Mowed) + }, { + METATILE_ID(General, WideTreeTopLeft_Grass), + METATILE_ID(General, WideTreeTopLeft_Mowed) + }, { + METATILE_ID(General, WideTreeTopRight_Grass), + METATILE_ID(General, WideTreeTopRight_Mowed) + }, { + METATILE_ID(CeladonCity, CyclingRoad_Grass), + METATILE_ID(CeladonCity, CyclingRoad_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed) + }, { + METATILE_ID(ViridianForest, HugeTreeTopMiddle_Grass), + METATILE_ID(ViridianForest, HugeTreeTopMiddle_Mowed) + }, { + 0xffff, + 0xffff + } }; static const struct OamData sOamData_FldEff_CutGrass = { -- cgit v1.2.3