diff options
-rw-r--r-- | asm/rom6.s | 474 | ||||
-rw-r--r-- | include/field_player_avatar.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/rom6.c | 206 |
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; + } +} |