summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsceptillion <33798691+sceptillion@users.noreply.github.com>2017-11-19 10:16:42 -0800
committersceptillion <33798691+sceptillion@users.noreply.github.com>2017-11-19 10:16:42 -0800
commitf4b39ff81d4387b4a29bad7d9bb0a223721773c9 (patch)
tree8ce5d72a6c8c9b5ef18dda76e5defbb455af072f
parentf3f3af1027ca1c0459e077f4dc98391bbbe821e4 (diff)
decompile fldeff_secretpower
-rwxr-xr-xasm/fldeff_secretpower.s640
-rw-r--r--include/field_effect.h2
-rw-r--r--include/rom6.h2
-rw-r--r--include/secret_base.h4
-rw-r--r--ld_script.txt2
-rw-r--r--src/field/field_effect.c2
-rw-r--r--src/field/fldeff_cut.c2
-rw-r--r--src/field/fldeff_secretpower.c304
8 files changed, 313 insertions, 645 deletions
diff --git a/asm/fldeff_secretpower.s b/asm/fldeff_secretpower.s
deleted file mode 100755
index a8e9b5883..000000000
--- a/asm/fldeff_secretpower.s
+++ /dev/null
@@ -1,640 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80C6264
-sub_80C6264: @ 80C6264
- push {lr}
- ldr r0, _080C6278 @ =gUnknown_0203923C
- ldr r1, _080C627C @ =gMapHeader
- ldr r1, [r1, 0x4]
- bl sub_80BBFD8
- bl sub_80BB5E4
- pop {r0}
- bx r0
- .align 2, 0
-_080C6278: .4byte gUnknown_0203923C
-_080C627C: .4byte gMapHeader
- thumb_func_end sub_80C6264
-
- thumb_func_start sub_80C6280
-sub_80C6280: @ 80C6280
- push {lr}
- ldr r1, _080C6294 @ =gFieldEffectArguments
- ldr r0, [r1, 0x4]
- cmp r0, 0x2
- beq _080C62AA
- cmp r0, 0x2
- bgt _080C6298
- cmp r0, 0x1
- beq _080C62A2
- b _080C62BE
- .align 2, 0
-_080C6294: .4byte gFieldEffectArguments
-_080C6298:
- cmp r0, 0x3
- beq _080C62AE
- cmp r0, 0x4
- beq _080C62B8
- b _080C62BE
-_080C62A2:
- movs r0, 0x8
- str r0, [r1, 0x14]
- movs r0, 0x28
- b _080C62BC
-_080C62AA:
- movs r0, 0x8
- b _080C62BA
-_080C62AE:
- movs r0, 0x8
- negs r0, r0
- str r0, [r1, 0x14]
- movs r0, 0x18
- b _080C62BC
-_080C62B8:
- movs r0, 0x18
-_080C62BA:
- str r0, [r1, 0x14]
-_080C62BC:
- str r0, [r1, 0x18]
-_080C62BE:
- pop {r0}
- bx r0
- thumb_func_end sub_80C6280
-
- thumb_func_start SetUpFieldMove_SecretPower
-SetUpFieldMove_SecretPower: @ 80C62C4
- push {r4,lr}
- bl sub_80BB63C
- ldr r0, _080C6318 @ =gScriptResult
- ldrh r0, [r0]
- cmp r0, 0x1
- beq _080C636E
- bl player_get_direction_lower_nybble
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x2
- bne _080C636E
- ldr r4, _080C631C @ =gUnknown_0203923C
- adds r1, r4, 0x2
- adds r0, r4, 0
- bl GetXYCoordsOneStepInFrontOfPlayer
- movs r1, 0
- ldrsh r0, [r4, r1]
- movs r2, 0x2
- ldrsh r1, [r4, r2]
- bl MapGridGetMetatileBehaviorAt
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl MetatileBehavior_IsSecretBaseCave
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080C6330
- bl sub_80C6264
- ldr r1, _080C6320 @ =gFieldCallback
- ldr r0, _080C6324 @ =FieldCallback_Teleport
- str r0, [r1]
- ldr r1, _080C6328 @ =gUnknown_03005CE4
- ldr r0, _080C632C @ =sub_80C639C
- b _080C6380
- .align 2, 0
-_080C6318: .4byte gScriptResult
-_080C631C: .4byte gUnknown_0203923C
-_080C6320: .4byte gFieldCallback
-_080C6324: .4byte FieldCallback_Teleport
-_080C6328: .4byte gUnknown_03005CE4
-_080C632C: .4byte sub_80C639C
-_080C6330:
- adds r0, r4, 0
- bl MetatileBehavior_IsSecretBaseTree
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080C6360
- bl sub_80C6264
- ldr r1, _080C6350 @ =gFieldCallback
- ldr r0, _080C6354 @ =FieldCallback_Teleport
- str r0, [r1]
- ldr r1, _080C6358 @ =gUnknown_03005CE4
- ldr r0, _080C635C @ =sub_80C64A8
- b _080C6380
- .align 2, 0
-_080C6350: .4byte gFieldCallback
-_080C6354: .4byte FieldCallback_Teleport
-_080C6358: .4byte gUnknown_03005CE4
-_080C635C: .4byte sub_80C64A8
-_080C6360:
- adds r0, r4, 0
- bl MetatileBehavior_IsSecretBaseShrub
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _080C6372
-_080C636E:
- movs r0, 0
- b _080C6384
-_080C6372:
- bl sub_80C6264
- ldr r1, _080C638C @ =gFieldCallback
- ldr r0, _080C6390 @ =FieldCallback_Teleport
- str r0, [r1]
- ldr r1, _080C6394 @ =gUnknown_03005CE4
- ldr r0, _080C6398 @ =sub_80C660C
-_080C6380:
- str r0, [r1]
- movs r0, 0x1
-_080C6384:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080C638C: .4byte gFieldCallback
-_080C6390: .4byte FieldCallback_Teleport
-_080C6394: .4byte gUnknown_03005CE4
-_080C6398: .4byte sub_80C660C
- thumb_func_end SetUpFieldMove_SecretPower
-
- thumb_func_start sub_80C639C
-sub_80C639C: @ 80C639C
- push {lr}
- ldr r1, _080C63B0 @ =gFieldEffectArguments
- ldr r0, _080C63B4 @ =gLastFieldPokeMenuOpened
- ldrb r0, [r0]
- str r0, [r1]
- ldr r0, _080C63B8 @ =gUnknown_081A2CE6
- bl ScriptContext1_SetupScript
- pop {r0}
- bx r0
- .align 2, 0
-_080C63B0: .4byte gFieldEffectArguments
-_080C63B4: .4byte gLastFieldPokeMenuOpened
-_080C63B8: .4byte gUnknown_081A2CE6
- thumb_func_end sub_80C639C
-
- thumb_func_start FldEff_UseSecretPowerCave
-FldEff_UseSecretPowerCave: @ 80C63BC
- push {lr}
- bl oei_task_add
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080C63E0 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _080C63E4 @ =sub_80C63E8
- lsrs r0, r2, 16
- strh r0, [r1, 0x18]
- strh r2, [r1, 0x1A]
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080C63E0: .4byte gTasks
-_080C63E4: .4byte sub_80C63E8
- thumb_func_end FldEff_UseSecretPowerCave
-
- thumb_func_start sub_80C63E8
-sub_80C63E8: @ 80C63E8
- push {lr}
- movs r0, 0xB
- bl FieldEffectActiveListRemove
- movs r0, 0x37
- bl FieldEffectStart
- pop {r0}
- bx r0
- thumb_func_end sub_80C63E8
-
- thumb_func_start FldEff_SecretPowerCave
-FldEff_SecretPowerCave: @ 80C63FC
- push {r4,lr}
- bl sub_80C6280
- ldr r0, _080C643C @ =gSpriteTemplate_83D2614
- ldr r3, _080C6440 @ =gSprites
- ldr r1, _080C6444 @ =gPlayerAvatar
- ldrb r1, [r1, 0x4]
- lsls r2, r1, 4
- adds r2, r1
- lsls r2, 2
- adds r2, r3
- ldrh r1, [r2, 0x2]
- lsls r1, 23
- lsrs r1, 23
- ldr r4, _080C6448 @ =gFieldEffectArguments
- ldr r3, [r4, 0x14]
- adds r1, r3
- lsls r1, 16
- asrs r1, 16
- ldrb r2, [r2]
- ldr r3, [r4, 0x18]
- adds r2, r3
- lsls r2, 16
- asrs r2, 16
- movs r3, 0x94
- bl CreateSprite
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080C643C: .4byte gSpriteTemplate_83D2614
-_080C6440: .4byte gSprites
-_080C6444: .4byte gPlayerAvatar
-_080C6448: .4byte gFieldEffectArguments
- thumb_func_end FldEff_SecretPowerCave
-
- thumb_func_start sub_80C644C
-sub_80C644C: @ 80C644C
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x83
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2E]
- ldr r0, _080C6464 @ =sub_80C6468
- str r0, [r4, 0x1C]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C6464: .4byte sub_80C6468
- thumb_func_end sub_80C644C
-
- thumb_func_start sub_80C6468
-sub_80C6468: @ 80C6468
- push {lr}
- adds r1, r0, 0
- ldrh r2, [r1, 0x2E]
- movs r3, 0x2E
- ldrsh r0, [r1, r3]
- cmp r0, 0x27
- bgt _080C6488
- adds r0, r2, 0x1
- strh r0, [r1, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x14
- bne _080C6490
- bl sub_80BB800
- b _080C6490
-_080C6488:
- movs r0, 0
- strh r0, [r1, 0x2E]
- ldr r0, _080C6494 @ =sub_80C6498
- str r0, [r1, 0x1C]
-_080C6490:
- pop {r0}
- bx r0
- .align 2, 0
-_080C6494: .4byte sub_80C6498
- thumb_func_end sub_80C6468
-
- thumb_func_start sub_80C6498
-sub_80C6498: @ 80C6498
- push {lr}
- movs r1, 0x37
- bl FieldEffectStop
- bl EnableBothScriptContexts
- pop {r0}
- bx r0
- thumb_func_end sub_80C6498
-
- thumb_func_start sub_80C64A8
-sub_80C64A8: @ 80C64A8
- push {lr}
- ldr r1, _080C64BC @ =gFieldEffectArguments
- ldr r0, _080C64C0 @ =gLastFieldPokeMenuOpened
- ldrb r0, [r0]
- str r0, [r1]
- ldr r0, _080C64C4 @ =gUnknown_081A2D3E
- bl ScriptContext1_SetupScript
- pop {r0}
- bx r0
- .align 2, 0
-_080C64BC: .4byte gFieldEffectArguments
-_080C64C0: .4byte gLastFieldPokeMenuOpened
-_080C64C4: .4byte gUnknown_081A2D3E
- thumb_func_end sub_80C64A8
-
- thumb_func_start FldEff_UseSecretPowerTree
-FldEff_UseSecretPowerTree: @ 80C64C8
- push {lr}
- bl oei_task_add
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080C64EC @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _080C64F0 @ =sub_80C64F4
- lsrs r0, r2, 16
- strh r0, [r1, 0x18]
- strh r2, [r1, 0x1A]
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080C64EC: .4byte gTasks
-_080C64F0: .4byte sub_80C64F4
- thumb_func_end FldEff_UseSecretPowerTree
-
- thumb_func_start sub_80C64F4
-sub_80C64F4: @ 80C64F4
- push {lr}
- movs r0, 0x1A
- bl FieldEffectActiveListRemove
- movs r0, 0x38
- bl FieldEffectStart
- pop {r0}
- bx r0
- thumb_func_end sub_80C64F4
-
- thumb_func_start FldEff_SecretPowerTree
-FldEff_SecretPowerTree: @ 80C6508
- push {r4,lr}
- ldr r1, _080C6580 @ =gUnknown_0203923C
- movs r2, 0
- ldrsh r0, [r1, r2]
- movs r2, 0x2
- ldrsh r1, [r1, r2]
- bl MapGridGetMetatileBehaviorAt
- adds r2, r0, 0
- ldr r1, _080C6584 @ =0x00000fff
- adds r0, r1, 0
- ands r2, r0
- cmp r2, 0x96
- bne _080C652A
- ldr r1, _080C6588 @ =gFieldEffectArguments
- movs r0, 0
- str r0, [r1, 0x1C]
-_080C652A:
- cmp r2, 0x9C
- bne _080C6534
- ldr r1, _080C6588 @ =gFieldEffectArguments
- movs r0, 0x2
- str r0, [r1, 0x1C]
-_080C6534:
- bl sub_80C6280
- ldr r0, _080C658C @ =gSpriteTemplate_83D262C
- ldr r3, _080C6590 @ =gSprites
- ldr r1, _080C6594 @ =gPlayerAvatar
- ldrb r1, [r1, 0x4]
- lsls r2, r1, 4
- adds r2, r1
- lsls r2, 2
- adds r2, r3
- ldrh r1, [r2, 0x2]
- lsls r1, 23
- lsrs r1, 23
- ldr r4, _080C6588 @ =gFieldEffectArguments
- ldr r3, [r4, 0x14]
- adds r1, r3
- lsls r1, 16
- asrs r1, 16
- ldrb r2, [r2]
- ldr r3, [r4, 0x18]
- adds r2, r3
- lsls r2, 16
- asrs r2, 16
- movs r3, 0x94
- bl CreateSprite
- ldr r0, [r4, 0x1C]
- cmp r0, 0x1
- beq _080C6572
- cmp r0, 0x3
- bne _080C6576
-_080C6572:
- bl sub_80BB800
-_080C6576:
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080C6580: .4byte gUnknown_0203923C
-_080C6584: .4byte 0x00000fff
-_080C6588: .4byte gFieldEffectArguments
-_080C658C: .4byte gSpriteTemplate_83D262C
-_080C6590: .4byte gSprites
-_080C6594: .4byte gPlayerAvatar
- thumb_func_end FldEff_SecretPowerTree
-
- thumb_func_start sub_80C6598
-sub_80C6598: @ 80C6598
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x9B
- bl PlaySE
- ldr r0, _080C65BC @ =gFieldEffectArguments
- ldr r1, [r0, 0x1C]
- adds r2, r4, 0
- adds r2, 0x2A
- movs r0, 0
- strb r1, [r2]
- strh r0, [r4, 0x2E]
- ldr r0, _080C65C0 @ =sub_80C65C4
- str r0, [r4, 0x1C]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C65BC: .4byte gFieldEffectArguments
-_080C65C0: .4byte sub_80C65C4
- thumb_func_end sub_80C6598
-
- thumb_func_start sub_80C65C4
-sub_80C65C4: @ 80C65C4
- push {r4,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x27
- ble _080C65EE
- ldr r0, _080C65F4 @ =gFieldEffectArguments
- ldr r0, [r0, 0x1C]
- cmp r0, 0
- beq _080C65E2
- cmp r0, 0x2
- bne _080C65E6
-_080C65E2:
- bl sub_80BB800
-_080C65E6:
- movs r0, 0
- strh r0, [r4, 0x2E]
- ldr r0, _080C65F8 @ =sub_80C65FC
- str r0, [r4, 0x1C]
-_080C65EE:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C65F4: .4byte gFieldEffectArguments
-_080C65F8: .4byte sub_80C65FC
- thumb_func_end sub_80C65C4
-
- thumb_func_start sub_80C65FC
-sub_80C65FC: @ 80C65FC
- push {lr}
- movs r1, 0x38
- bl FieldEffectStop
- bl EnableBothScriptContexts
- pop {r0}
- bx r0
- thumb_func_end sub_80C65FC
-
- thumb_func_start sub_80C660C
-sub_80C660C: @ 80C660C
- push {lr}
- ldr r1, _080C6620 @ =gFieldEffectArguments
- ldr r0, _080C6624 @ =gLastFieldPokeMenuOpened
- ldrb r0, [r0]
- str r0, [r1]
- ldr r0, _080C6628 @ =gUnknown_081A2D96
- bl ScriptContext1_SetupScript
- pop {r0}
- bx r0
- .align 2, 0
-_080C6620: .4byte gFieldEffectArguments
-_080C6624: .4byte gLastFieldPokeMenuOpened
-_080C6628: .4byte gUnknown_081A2D96
- thumb_func_end sub_80C660C
-
- thumb_func_start FldEff_UseSecretPowerShrub
-FldEff_UseSecretPowerShrub: @ 80C662C
- push {lr}
- bl oei_task_add
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080C6650 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _080C6654 @ =sub_80C6658
- lsrs r0, r2, 16
- strh r0, [r1, 0x18]
- strh r2, [r1, 0x1A]
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080C6650: .4byte gTasks
-_080C6654: .4byte sub_80C6658
- thumb_func_end FldEff_UseSecretPowerShrub
-
- thumb_func_start sub_80C6658
-sub_80C6658: @ 80C6658
- push {lr}
- movs r0, 0x1B
- bl FieldEffectActiveListRemove
- movs r0, 0x39
- bl FieldEffectStart
- pop {r0}
- bx r0
- thumb_func_end sub_80C6658
-
- thumb_func_start FldEff_SecretPowerShrub
-FldEff_SecretPowerShrub: @ 80C666C
- push {r4,lr}
- bl sub_80C6280
- ldr r0, _080C66AC @ =gSpriteTemplate_83D2644
- ldr r3, _080C66B0 @ =gSprites
- ldr r1, _080C66B4 @ =gPlayerAvatar
- ldrb r1, [r1, 0x4]
- lsls r2, r1, 4
- adds r2, r1
- lsls r2, 2
- adds r2, r3
- ldrh r1, [r2, 0x2]
- lsls r1, 23
- lsrs r1, 23
- ldr r4, _080C66B8 @ =gFieldEffectArguments
- ldr r3, [r4, 0x14]
- adds r1, r3
- lsls r1, 16
- asrs r1, 16
- ldrb r2, [r2]
- ldr r3, [r4, 0x18]
- adds r2, r3
- lsls r2, 16
- asrs r2, 16
- movs r3, 0x94
- bl CreateSprite
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080C66AC: .4byte gSpriteTemplate_83D2644
-_080C66B0: .4byte gSprites
-_080C66B4: .4byte gPlayerAvatar
-_080C66B8: .4byte gFieldEffectArguments
- thumb_func_end FldEff_SecretPowerShrub
-
- thumb_func_start sub_80C66BC
-sub_80C66BC: @ 80C66BC
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0xA9
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2E]
- ldr r0, _080C66D4 @ =sub_80C66D8
- str r0, [r4, 0x1C]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C66D4: .4byte sub_80C66D8
- thumb_func_end sub_80C66BC
-
- thumb_func_start sub_80C66D8
-sub_80C66D8: @ 80C66D8
- push {lr}
- adds r1, r0, 0
- ldrh r2, [r1, 0x2E]
- movs r3, 0x2E
- ldrsh r0, [r1, r3]
- cmp r0, 0x27
- bgt _080C66F8
- adds r0, r2, 0x1
- strh r0, [r1, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x14
- bne _080C6700
- bl sub_80BB800
- b _080C6700
-_080C66F8:
- movs r0, 0
- strh r0, [r1, 0x2E]
- ldr r0, _080C6704 @ =sub_80C6708
- str r0, [r1, 0x1C]
-_080C6700:
- pop {r0}
- bx r0
- .align 2, 0
-_080C6704: .4byte sub_80C6708
- thumb_func_end sub_80C66D8
-
- thumb_func_start sub_80C6708
-sub_80C6708: @ 80C6708
- push {lr}
- movs r1, 0x39
- bl FieldEffectStop
- bl EnableBothScriptContexts
- pop {r0}
- bx r0
- thumb_func_end sub_80C6708
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/field_effect.h b/include/field_effect.h
index dbd92b088..9f71efba1 100644
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -253,6 +253,6 @@ void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8);
void sub_80878A8(void);
void sub_8087BA8(void);
-extern u32 gFieldEffectArguments[8];
+extern s32 gFieldEffectArguments[8];
#endif // GUARD_FIELD_EFFECT_H
diff --git a/include/rom6.h b/include/rom6.h
index e7a3ba48e..8c3691624 100644
--- a/include/rom6.h
+++ b/include/rom6.h
@@ -1,6 +1,8 @@
#ifndef GUARD_ROM6_H
#define GUARD_ROM6_H
+extern struct MapPosition gUnknown_0203923C;
+
bool8 npc_before_player_of_type(u8);
u8 oei_task_add(void);
diff --git a/include/secret_base.h b/include/secret_base.h
index 07784556f..abe5d781f 100644
--- a/include/secret_base.h
+++ b/include/secret_base.h
@@ -5,9 +5,13 @@
#define MAX_SECRET_BASES 20
void ResetSecretBases(void);
+void sub_80BB5E4(void);
+void sub_80BB63C(void);
+void sub_80BB800(void);
void sub_80BB970(struct MapEvents *events);
u8 sub_80BBB24(void);
void sub_80BBCCC(u8 flagIn);
+void sub_80BBFD8(struct MapPosition *, struct MapEvents *);
void sub_80BC038(struct MapPosition *, struct MapEvents *);
u8 sub_80BC050();
u8 *GetSecretBaseMapName(u8 *dest);
diff --git a/ld_script.txt b/ld_script.txt
index 0842c74e0..21c80dcc4 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -159,7 +159,7 @@ SECTIONS {
src/field/field_poison.o(.text);
src/pokemon/pokemon_size_record.o(.text);
asm/pc_screen_effect.o(.text);
- asm/fldeff_secretpower.o(.text);
+ src/field/fldeff_secretpower.o(.text);
src/field/fldeff_secret_base_pc.o(.text);
asm/fldeff_decoration.o(.text);
src/field/fldeff_poison.o(.text);
diff --git a/src/field/field_effect.c b/src/field/field_effect.c
index e15dc906f..0ccbb6230 100644
--- a/src/field/field_effect.c
+++ b/src/field/field_effect.c
@@ -28,7 +28,7 @@
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
-EWRAM_DATA u32 gFieldEffectArguments[8] = {0};
+EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal");
diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c
index 6e7f14a8c..599c916a2 100644
--- a/src/field/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -23,8 +23,6 @@ extern void (*gUnknown_03005CE4)(void);
extern struct SpriteTemplate gSpriteTemplate_CutGrass;
-extern struct MapPosition gUnknown_0203923C;
-
extern u8 gLastFieldPokeMenuOpened;
extern u8 S_UseCut[];
diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c
new file mode 100644
index 000000000..fd1548c46
--- /dev/null
+++ b/src/field/fldeff_secretpower.c
@@ -0,0 +1,304 @@
+#include "global.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "metatile_behavior.h"
+#include "metatile_behaviors.h"
+#include "overworld.h"
+#include "pokemon_menu.h"
+#include "rom6.h"
+#include "script.h"
+#include "secret_base.h"
+#include "songs.h"
+#include "sound.h"
+
+extern u8 gUnknown_081A2CE6[];
+extern u8 gUnknown_081A2D3E[];
+extern u8 gUnknown_081A2D96[];
+
+extern struct SpriteTemplate gSpriteTemplate_83D2614;
+extern struct SpriteTemplate gSpriteTemplate_83D262C;
+extern struct SpriteTemplate gSpriteTemplate_83D2644;
+
+void sub_80C639C(void);
+void sub_80C63E8(void);
+void sub_80C6468(struct Sprite *);
+void sub_80C6498(struct Sprite *);
+void sub_80C64A8(void);
+void sub_80C64F4(void);
+void sub_80C65C4(struct Sprite *);
+void sub_80C65FC(struct Sprite *);
+void sub_80C660C(void);
+void sub_80C6658(void);
+void sub_80C66D8(struct Sprite *sprite);
+void sub_80C6708(struct Sprite *sprite);
+
+void sub_80C6264(void)
+{
+ sub_80BBFD8(&gUnknown_0203923C, gMapHeader.events);
+ sub_80BB5E4();
+}
+
+void sub_80C6280(void)
+{
+ switch (gFieldEffectArguments[1])
+ {
+ case 1:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 40;
+ break;
+ case 2:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 8;
+ break;
+ case 3:
+ gFieldEffectArguments[5] = -8;
+ gFieldEffectArguments[6] = 24;
+ break;
+ case 4:
+ gFieldEffectArguments[5] = 24;
+ gFieldEffectArguments[6] = 24;
+ break;
+ }
+}
+
+bool8 SetUpFieldMove_SecretPower(void)
+{
+ u8 behavior;
+
+ sub_80BB63C();
+
+ if (gScriptResult == 1 || player_get_direction_lower_nybble() != 2)
+ return FALSE;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y);
+
+ if (MetatileBehavior_IsSecretBaseCave(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C639C;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseTree(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C64A8;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseShrub(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C660C;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80C639C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2CE6);
+}
+
+bool8 FldEff_UseSecretPowerCave(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C63E8 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C63E8;
+
+ return FALSE;
+}
+
+void sub_80C63E8(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_CAVE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_CAVE);
+}
+
+bool8 FldEff_SecretPowerCave(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2614,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C644C(struct Sprite *sprite)
+{
+ PlaySE(SE_W088);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6468;
+}
+
+void sub_80C6468(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6498;
+ }
+}
+
+void sub_80C6498(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_CAVE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C64A8(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D3E);
+}
+
+bool8 FldEff_UseSecretPowerTree(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C64F4 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C64F4;
+
+ return FALSE;
+}
+
+void sub_80C64F4(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_TREE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_TREE);
+}
+
+bool8 FldEff_SecretPowerTree(void)
+{
+ s16 behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y) & 0xFFF;
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_1)
+ {
+ gFieldEffectArguments[7] = 0;
+ }
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_2)
+ {
+ gFieldEffectArguments[7] = 2;
+ }
+
+ sub_80C6280();
+
+ CreateSprite(
+ &gSpriteTemplate_83D262C,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+
+ if (gFieldEffectArguments[7] == 1 || gFieldEffectArguments[7] == 3)
+ sub_80BB800();
+
+ return FALSE;
+}
+
+void sub_80C6598(struct Sprite *sprite)
+{
+ PlaySE(SE_W010);
+ sprite->animNum = gFieldEffectArguments[7];
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65C4;
+}
+
+void sub_80C65C4(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+
+ if (sprite->data[0] >= 40)
+ {
+ if (gFieldEffectArguments[7] == 0 || gFieldEffectArguments[7] == 2)
+ sub_80BB800();
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65FC;
+ }
+}
+
+
+void sub_80C65FC(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_TREE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C660C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D96);
+}
+
+bool8 FldEff_UseSecretPowerShrub(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C6658 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C6658;
+
+ return FALSE;
+}
+
+void sub_80C6658(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_SHRUB);
+ FieldEffectStart(FLDEFF_SECRET_POWER_SHRUB);
+}
+
+bool8 FldEff_SecretPowerShrub(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2644,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C66BC(struct Sprite *sprite)
+{
+ PlaySE(SE_W077);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C66D8;
+}
+
+void sub_80C66D8(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6708;
+ }
+}
+
+
+void sub_80C6708(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_SHRUB);
+ EnableBothScriptContexts();
+}