summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/rom6.s474
-rw-r--r--include/field_player_avatar.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/rom6.c206
4 files changed, 208 insertions, 476 deletions
diff --git a/asm/rom6.s b/asm/rom6.s
deleted file mode 100644
index 16899bf2e..000000000
--- a/asm/rom6.s
+++ /dev/null
@@ -1,474 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start npc_before_player_of_type
-npc_before_player_of_type: @ 810B2D4
- push {r4,r5,lr}
- adds r5, r0, 0
- lsls r5, 24
- lsrs r5, 24
- ldr r4, _0810B314 @ =gUnknown_0203923C
- adds r1, r4, 0x2
- adds r0, r4, 0
- bl GetXYCoordsOneStepInFrontOfPlayer
- bl PlayerGetZCoord
- strb r0, [r4, 0x4]
- ldrh r0, [r4]
- ldrh r1, [r4, 0x2]
- ldrb r2, [r4, 0x4]
- bl GetFieldObjectIdByXYZ
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0810B318 @ =gMapObjects
- lsls r1, r0, 3
- adds r1, r0
- lsls r1, 2
- adds r2, r1, r2
- ldrb r0, [r2, 0x5]
- cmp r0, r5
- bne _0810B320
- ldr r1, _0810B31C @ =gScriptLastTalked
- ldrb r0, [r2, 0x8]
- strh r0, [r1]
- movs r0, 0x1
- b _0810B322
- .align 2, 0
-_0810B314: .4byte gUnknown_0203923C
-_0810B318: .4byte gMapObjects
-_0810B31C: .4byte gScriptLastTalked
-_0810B320:
- movs r0, 0
-_0810B322:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end npc_before_player_of_type
-
- thumb_func_start oei_task_add
-oei_task_add: @ 810B328
- push {lr}
- ldr r0, _0810B344 @ =gUnknown_0203923C
- adds r1, r0, 0x2
- bl GetXYCoordsOneStepInFrontOfPlayer
- ldr r0, _0810B348 @ =task08_080C9820
- movs r1, 0x8
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_0810B344: .4byte gUnknown_0203923C
-_0810B348: .4byte task08_080C9820
- thumb_func_end oei_task_add
-
- thumb_func_start task08_080C9820
-task08_080C9820: @ 810B34C
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- adds r6, r5, 0
- bl ScriptContext2_Enable
- ldr r1, _0810B3A0 @ =gPlayerAvatar
- movs r0, 0x1
- strb r0, [r1, 0x6]
- ldrb r1, [r1, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0810B3A4 @ =gMapObjects
- adds r4, r0, r1
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _0810B382
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _0810B3CE
-_0810B382:
- ldr r0, _0810B3A8 @ =gMapHeader
- ldrb r0, [r0, 0x17]
- cmp r0, 0x5
- bne _0810B3B4
- movs r0, 0x3B
- bl FieldEffectStart
- ldr r0, _0810B3AC @ =gTasks
- lsls r1, r5, 2
- adds r1, r5
- lsls r1, 3
- adds r1, r0
- ldr r0, _0810B3B0 @ =sub_810B428
- b _0810B3CC
- .align 2, 0
-_0810B3A0: .4byte gPlayerAvatar
-_0810B3A4: .4byte gMapObjects
-_0810B3A8: .4byte gMapHeader
-_0810B3AC: .4byte gTasks
-_0810B3B0: .4byte sub_810B428
-_0810B3B4:
- bl sub_8059BF4
- adds r0, r4, 0
- movs r1, 0x39
- bl FieldObjectSetSpecialAnim
- ldr r0, _0810B3D4 @ =gTasks
- lsls r1, r6, 2
- adds r1, r6
- lsls r1, 3
- adds r1, r0
- ldr r0, _0810B3D8 @ =sub_810B3DC
-_0810B3CC:
- str r0, [r1]
-_0810B3CE:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0810B3D4: .4byte gTasks
-_0810B3D8: .4byte sub_810B3DC
- thumb_func_end task08_080C9820
-
- thumb_func_start sub_810B3DC
-sub_810B3DC: @ 810B3DC
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _0810B418 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0810B41C @ =gMapObjects
- adds r0, r1
- bl FieldObjectCheckIfSpecialAnimFinishedOrInactive
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _0810B410
- movs r0, 0x3B
- bl FieldEffectStart
- ldr r0, _0810B420 @ =gTasks
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _0810B424 @ =sub_810B428
- str r0, [r1]
-_0810B410:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810B418: .4byte gPlayerAvatar
-_0810B41C: .4byte gMapObjects
-_0810B420: .4byte gTasks
-_0810B424: .4byte sub_810B428
- thumb_func_end sub_810B3DC
-
- thumb_func_start sub_810B428
-sub_810B428: @ 810B428
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r7, r0, 24
- movs r0, 0x6
- bl FieldEffectActiveListContains
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- bne _0810B4AC
- bl player_get_direction_lower_nybble
- ldr r6, _0810B4B4 @ =gUnknown_0202FF84
- lsls r0, 24
- lsrs r0, 24
- str r0, [r6, 0x4]
- cmp r0, 0x1
- bne _0810B44E
- str r4, [r6, 0x8]
-_0810B44E:
- ldr r1, [r6, 0x4]
- cmp r1, 0x2
- bne _0810B458
- movs r0, 0x1
- str r0, [r6, 0x8]
-_0810B458:
- cmp r1, 0x3
- bne _0810B460
- movs r0, 0x2
- str r0, [r6, 0x8]
-_0810B460:
- cmp r1, 0x4
- bne _0810B468
- movs r0, 0x3
- str r0, [r6, 0x8]
-_0810B468:
- ldr r5, _0810B4B8 @ =gPlayerAvatar
- ldrb r0, [r5, 0x5]
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _0810B4BC @ =gMapObjects
- adds r4, r0
- bl GetPlayerAvatarGraphicsIdByCurrentState
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl sub_805B980
- ldrb r1, [r5, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _0810B4C0 @ =gSprites
- adds r0, r1
- ldrb r1, [r6, 0x8]
- bl StartSpriteAnim
- movs r0, 0x6
- bl FieldEffectActiveListRemove
- ldr r1, _0810B4C4 @ =gTasks
- lsls r0, r7, 2
- adds r0, r7
- lsls r0, 3
- adds r0, r1
- ldr r1, _0810B4C8 @ =sub_810B4CC
- str r1, [r0]
-_0810B4AC:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0810B4B4: .4byte gUnknown_0202FF84
-_0810B4B8: .4byte gPlayerAvatar
-_0810B4BC: .4byte gMapObjects
-_0810B4C0: .4byte gSprites
-_0810B4C4: .4byte gTasks
-_0810B4C8: .4byte sub_810B4CC
- thumb_func_end sub_810B428
-
- thumb_func_start sub_810B4CC
-sub_810B4CC: @ 810B4CC
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r1, _0810B4FC @ =gTasks
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- ldrh r1, [r0, 0x18]
- lsls r1, 16
- ldrh r0, [r0, 0x1A]
- orrs r1, r0
- bl _call_via_r1
- ldr r1, _0810B500 @ =gPlayerAvatar
- movs r0, 0
- strb r0, [r1, 0x6]
- adds r0, r4, 0
- bl DestroyTask
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810B4FC: .4byte gTasks
-_0810B500: .4byte gPlayerAvatar
- thumb_func_end sub_810B4CC
-
- thumb_func_start SetUpFieldMove_RockSmash
-SetUpFieldMove_RockSmash: @ 810B504
- push {lr}
- movs r0, 0x56
- bl npc_before_player_of_type
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0810B518
- movs r0, 0
- b _0810B526
-_0810B518:
- ldr r1, _0810B52C @ =gUnknown_0300485C
- ldr r0, _0810B530 @ =sub_808AB90
- str r0, [r1]
- ldr r1, _0810B534 @ =gUnknown_03005CE4
- ldr r0, _0810B538 @ =sub_810B53C
- str r0, [r1]
- movs r0, 0x1
-_0810B526:
- pop {r1}
- bx r1
- .align 2, 0
-_0810B52C: .4byte gUnknown_0300485C
-_0810B530: .4byte sub_808AB90
-_0810B534: .4byte gUnknown_03005CE4
-_0810B538: .4byte sub_810B53C
- thumb_func_end SetUpFieldMove_RockSmash
-
- thumb_func_start sub_810B53C
-sub_810B53C: @ 810B53C
- push {lr}
- ldr r1, _0810B550 @ =gUnknown_0202FF84
- ldr r0, _0810B554 @ =gUnknown_03005CE0
- ldrb r0, [r0]
- str r0, [r1]
- ldr r0, _0810B558 @ =UseRockSmashScript
- bl ScriptContext1_SetupScript
- pop {r0}
- bx r0
- .align 2, 0
-_0810B550: .4byte gUnknown_0202FF84
-_0810B554: .4byte gUnknown_03005CE0
-_0810B558: .4byte UseRockSmashScript
- thumb_func_end sub_810B53C
-
- thumb_func_start FldEff_RockSmash
-FldEff_RockSmash: @ 810B55C
- push {lr}
- bl oei_task_add
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0810B584 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _0810B588 @ =sub_810B58C
- lsrs r0, r2, 16
- strh r0, [r1, 0x18]
- strh r2, [r1, 0x1A]
- movs r0, 0x13
- bl IncrementGameStat
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_0810B584: .4byte gTasks
-_0810B588: .4byte sub_810B58C
- thumb_func_end FldEff_RockSmash
-
- thumb_func_start sub_810B58C
-sub_810B58C: @ 810B58C
- push {lr}
- movs r0, 0x83
- bl PlaySE
- movs r0, 0x25
- bl FieldEffectActiveListRemove
- bl EnableBothScriptContexts
- pop {r0}
- bx r0
- thumb_func_end sub_810B58C
-
- thumb_func_start SetUpFieldMove_Dig
-SetUpFieldMove_Dig: @ 810B5A4
- push {lr}
- bl sub_80CA1C8
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0810B5B6
- movs r0, 0
- b _0810B5C4
-_0810B5B6:
- ldr r1, _0810B5C8 @ =gUnknown_0300485C
- ldr r0, _0810B5CC @ =sub_808AB90
- str r0, [r1]
- ldr r1, _0810B5D0 @ =gUnknown_03005CE4
- ldr r0, _0810B5D4 @ =sub_810B5D8
- str r0, [r1]
- movs r0, 0x1
-_0810B5C4:
- pop {r1}
- bx r1
- .align 2, 0
-_0810B5C8: .4byte gUnknown_0300485C
-_0810B5CC: .4byte sub_808AB90
-_0810B5D0: .4byte gUnknown_03005CE4
-_0810B5D4: .4byte sub_810B5D8
- thumb_func_end SetUpFieldMove_Dig
-
- thumb_func_start sub_810B5D8
-sub_810B5D8: @ 810B5D8
- push {lr}
- bl sub_8053014
- movs r0, 0x26
- bl FieldEffectStart
- ldr r0, _0810B5F0 @ =gUnknown_0202FF84
- ldr r1, _0810B5F4 @ =gUnknown_03005CE0
- ldrb r1, [r1]
- str r1, [r0]
- pop {r0}
- bx r0
- .align 2, 0
-_0810B5F0: .4byte gUnknown_0202FF84
-_0810B5F4: .4byte gUnknown_03005CE0
- thumb_func_end sub_810B5D8
-
- thumb_func_start FldEff_UseDig
-FldEff_UseDig: @ 810B5F8
- push {lr}
- bl oei_task_add
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0810B62C @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _0810B630 @ =sub_810B634
- lsrs r0, r2, 16
- strh r0, [r1, 0x18]
- strh r2, [r1, 0x1A]
- bl ShouldDoBrailleDigEffect
- lsls r0, 24
- cmp r0, 0
- bne _0810B624
- movs r0, 0x1
- bl SetPlayerAvatarTransitionFlags
-_0810B624:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_0810B62C: .4byte gTasks
-_0810B630: .4byte sub_810B634
- thumb_func_end FldEff_UseDig
-
- thumb_func_start sub_810B634
-sub_810B634: @ 810B634
- push {r4,lr}
- movs r0, 0x26
- bl FieldEffectActiveListRemove
- bl ShouldDoBrailleDigEffect
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- beq _0810B64E
- bl DoBrailleDigEffect
- b _0810B666
-_0810B64E:
- ldr r0, _0810B66C @ =task08_080A1C44
- movs r1, 0x8
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0810B670 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- strh r4, [r1, 0x8]
-_0810B666:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810B66C: .4byte task08_080A1C44
-_0810B670: .4byte gTasks
- thumb_func_end sub_810B634
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index 630d7b19d..b07690f61 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -74,7 +74,7 @@ bool8 IsPlayerSurfingNorth(void);
bool8 IsPlayerFacingSurfableFishableWater(void);
// ClearPlayerAvatarInfo
void SetPlayerAvatarStateMask(u8 a);
-// GetPlayerAvatarGraphicsIdByCurrentState
+u8 GetPlayerAvatarGraphicsIdByCurrentState(void);
// SetPlayerAvatarExtraStateTransition
void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 d);
// sub_8059B88
diff --git a/ld_script.txt b/ld_script.txt
index 5dc385350..fa8dfbc4b 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -197,7 +197,7 @@ SECTIONS {
asm/trader.o(.text);
src/starter_choose.o(.text);
src/wallclock.o(.text);
- asm/rom6.o(.text);
+ src/rom6.o(.text);
asm/pokeblock.o(.text);
asm/rom_810CBB4.o(.text);
asm/battle_records.o(.text);
diff --git a/src/rom6.c b/src/rom6.c
new file mode 100644
index 000000000..581bd46b4
--- /dev/null
+++ b/src/rom6.c
@@ -0,0 +1,206 @@
+#include "global.h"
+#include "asm.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "rom4.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+extern u16 gScriptLastTalked;
+extern u32 gUnknown_0202FF84[];
+extern struct MapPosition gUnknown_0203923C;
+extern void (*gUnknown_0300485C)(void);
+extern u8 gUnknown_03005CE0;
+extern void (*gUnknown_03005CE4)(void);
+extern u8 UseRockSmashScript[];
+
+extern bool8 ShouldDoBrailleDigEffect(void);
+extern void DoBrailleDigEffect(void);
+extern void sub_8053014(void);
+extern void sub_8059BF4(void);
+extern void sub_808AB90(void);
+extern void task08_080A1C44(u8);
+extern u8 sub_80CA1C8(void);
+
+static void task08_080C9820(u8);
+static void sub_810B3DC(u8);
+static void sub_810B428(u8);
+static void sub_810B4CC(u8);
+static void sub_810B53C(void);
+static void sub_810B58C(void);
+static void sub_810B5D8(void);
+static void sub_810B634(void);
+
+bool8 npc_before_player_of_type(u8 a)
+{
+ u8 mapObjId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ gUnknown_0203923C.height = PlayerGetZCoord();
+ mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height);
+ if (gMapObjects[mapObjId].graphicsId != a)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gScriptLastTalked = gMapObjects[mapObjId].localId;
+ return TRUE;
+ }
+}
+
+u8 oei_task_add(void)
+{
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ return CreateTask(task08_080C9820, 8);
+}
+
+static void task08_080C9820(u8 taskId)
+{
+ u8 mapObjId;
+
+ ScriptContext2_Enable();
+ gPlayerAvatar.unk6 = 1;
+ mapObjId = gPlayerAvatar.mapObjectId;
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId])
+ || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]))
+ {
+ if (gMapHeader.mapType == 5)
+ {
+ FieldEffectStart(0x3B);
+ gTasks[taskId].func = sub_810B428;
+ }
+ else
+ {
+ sub_8059BF4();
+ FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39);
+ gTasks[taskId].func = sub_810B3DC;
+ }
+ }
+}
+
+static void sub_810B3DC(u8 taskId)
+{
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
+ {
+ FieldEffectStart(0x3B);
+ gTasks[taskId].func = sub_810B428;
+ }
+}
+
+static void sub_810B428(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(6))
+ {
+ gUnknown_0202FF84[1] = player_get_direction_lower_nybble();
+ if (gUnknown_0202FF84[1] == 1)
+ gUnknown_0202FF84[2] = 0;
+ if (gUnknown_0202FF84[1] == 2)
+ gUnknown_0202FF84[2] = 1;
+ if (gUnknown_0202FF84[1] == 3)
+ gUnknown_0202FF84[2] = 2;
+ if (gUnknown_0202FF84[1] == 4)
+ gUnknown_0202FF84[2] = 3;
+ sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
+ StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gUnknown_0202FF84[2]);
+ FieldEffectActiveListRemove(6);
+ gTasks[taskId].func = sub_810B4CC;
+ }
+}
+
+static void sub_810B4CC(u8 taskId)
+{
+ void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]);
+
+ func();
+ gPlayerAvatar.unk6 = 0;
+ DestroyTask(taskId);
+}
+
+bool8 SetUpFieldMove_RockSmash(void)
+{
+ if (npc_before_player_of_type(0x56) == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_810B53C;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_810B53C(void)
+{
+ gUnknown_0202FF84[0] = gUnknown_03005CE0;
+ ScriptContext1_SetupScript(UseRockSmashScript);
+}
+
+int FldEff_RockSmash(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_810B58C >> 16;
+ gTasks[taskId].data[9] = (u32)sub_810B58C;
+ IncrementGameStat(0x13);
+ return 0;
+}
+
+static void sub_810B58C(void)
+{
+ PlaySE(SE_W088);
+ FieldEffectActiveListRemove(0x25);
+ EnableBothScriptContexts();
+}
+
+int SetUpFieldMove_Dig(void)
+{
+ if (sub_80CA1C8() == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_810B5D8;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_810B5D8(void)
+{
+ sub_8053014();
+ FieldEffectStart(0x26);
+ gUnknown_0202FF84[0] = gUnknown_03005CE0;
+}
+
+int FldEff_UseDig(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_810B634 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_810B634;
+ if (!ShouldDoBrailleDigEffect())
+ SetPlayerAvatarTransitionFlags(1);
+ return 0;
+}
+
+static void sub_810B634(void)
+{
+ u8 taskId;
+
+ FieldEffectActiveListRemove(0x26);
+ if (ShouldDoBrailleDigEffect())
+ {
+ DoBrailleDigEffect();
+ }
+ else
+ {
+ taskId = CreateTask(task08_080A1C44, 8);
+ gTasks[taskId].data[0] = 0;
+ }
+}