summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-26 09:11:24 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-26 09:11:24 -0500
commit51e2b99b9d748755b77fa3bdbc86d261d58fc74c (patch)
tree75327a1d1a789faf008ebd90f323a30fbc5f63c1
parent41644b283ad2d4fb5e30b61271c5820c1ccbc499 (diff)
Finish fldeff_cut
-rw-r--r--asm/fldeff_cut.s296
-rw-r--r--data/fldeff_cut.s40
-rw-r--r--include/event_object_movement.h4
-rw-r--r--ld_script.txt3
-rw-r--r--src/fldeff_cut.c183
-rw-r--r--sym_ewram.txt8
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"