diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-26 09:11:24 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-26 09:11:24 -0500 |
commit | 51e2b99b9d748755b77fa3bdbc86d261d58fc74c (patch) | |
tree | 75327a1d1a789faf008ebd90f323a30fbc5f63c1 | |
parent | 41644b283ad2d4fb5e30b61271c5820c1ccbc499 (diff) |
Finish fldeff_cut
-rw-r--r-- | asm/fldeff_cut.s | 296 | ||||
-rw-r--r-- | data/fldeff_cut.s | 40 | ||||
-rw-r--r-- | include/event_object_movement.h | 4 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/fldeff_cut.c | 183 | ||||
-rw-r--r-- | sym_ewram.txt | 8 |
6 files changed, 179 insertions, 355 deletions
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" |