diff options
-rw-r--r-- | asm/field_door.s | 613 | ||||
-rw-r--r-- | asm/metatile_behavior.s | 6 | ||||
-rw-r--r-- | asm/rom_8080874.s | 10 | ||||
-rw-r--r-- | data/data2.s | 4 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/field_door.c | 233 | ||||
-rw-r--r-- | src/rom4.c | 4 | ||||
-rw-r--r-- | src/scrcmd.c | 58 |
8 files changed, 275 insertions, 655 deletions
diff --git a/asm/field_door.s b/asm/field_door.s deleted file mode 100644 index 56a7254ca..000000000 --- a/asm/field_door.s +++ /dev/null @@ -1,613 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/species_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8058378 -sub_8058378: @ 8058378 - push {lr} - ldr r1, _08058388 @ =0x06007f00 - movs r2, 0x40 - bl CpuFastSet - pop {r0} - bx r0 - .align 2, 0 -_08058388: .4byte 0x06007f00 - thumb_func_end sub_8058378 - - thumb_func_start door_build_blockdef -door_build_blockdef: @ 805838C - push {r4-r6,lr} - adds r6, r0, 0 - lsls r1, 16 - lsrs r5, r1, 16 - movs r4, 0 - adds r1, r6, 0 -_08058398: - ldrb r0, [r2] - lsls r0, 28 - lsrs r3, r0, 16 - adds r2, 0x1 - adds r0, r5, r4 - orrs r3, r0 - strh r3, [r1] - adds r1, 0x2 - adds r4, 0x1 - cmp r4, 0x3 - ble _08058398 - cmp r4, 0x7 - bgt _080583C6 - lsls r0, r4, 1 - adds r1, r0, r6 -_080583B6: - ldrb r0, [r2] - lsls r3, r0, 12 - adds r2, 0x1 - strh r3, [r1] - adds r1, 0x2 - adds r4, 0x1 - cmp r4, 0x7 - ble _080583B6 -_080583C6: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end door_build_blockdef - - thumb_func_start sub_80583CC -sub_80583CC: @ 80583CC - push {r4-r6,lr} - sub sp, 0x10 - adds r5, r0, 0 - adds r6, r1, 0 - adds r4, r2, 0 - movs r1, 0xFE - lsls r1, 2 - mov r0, sp - bl door_build_blockdef - subs r1, r6, 0x1 - adds r0, r5, 0 - mov r2, sp - bl DrawDoorMetatileAt - movs r1, 0xFF - lsls r1, 2 - adds r4, 0x4 - mov r0, sp - adds r2, r4, 0 - bl door_build_blockdef - adds r0, r5, 0 - adds r1, r6, 0 - mov r2, sp - bl DrawDoorMetatileAt - add sp, 0x10 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80583CC - - thumb_func_start sub_805840C -sub_805840C: @ 805840C - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - subs r1, r5, 0x1 - bl CurrentMapDrawMetatileAt - adds r0, r4, 0 - adds r1, r5, 0 - bl CurrentMapDrawMetatileAt - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_805840C - - thumb_func_start sub_8058428 -sub_8058428: @ 8058428 - push {r4-r7,lr} - adds r5, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - adds r7, r3, 0 - ldrh r1, [r4, 0x2] - ldr r0, _08058444 @ =0x0000ffff - cmp r1, r0 - bne _08058448 - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_805840C - b _0805845C - .align 2, 0 -_08058444: .4byte 0x0000ffff -_08058448: - ldrh r1, [r4, 0x2] - ldr r0, [r5, 0x4] - adds r0, r1 - bl sub_8058378 - ldr r2, [r5, 0x8] - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_80583CC -_0805845C: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8058428 - - thumb_func_start sub_8058464 -sub_8058464: @ 8058464 - push {r4-r6,lr} - adds r6, r0, 0 - adds r5, r1, 0 - adds r4, r2, 0 - movs r1, 0xA - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0805848A - movs r2, 0x8 - ldrsh r1, [r4, r2] - lsls r1, 2 - adds r1, r5, r1 - movs r0, 0xC - ldrsh r2, [r4, r0] - movs r0, 0xE - ldrsh r3, [r4, r0] - adds r0, r6, 0 - bl sub_8058428 -_0805848A: - movs r2, 0xA - ldrsh r1, [r4, r2] - movs r2, 0x8 - ldrsh r0, [r4, r2] - lsls r0, 2 - adds r0, r5 - ldrb r0, [r0] - cmp r1, r0 - bne _080584B8 - movs r0, 0 - strh r0, [r4, 0xA] - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - movs r1, 0x8 - ldrsh r0, [r4, r1] - lsls r0, 2 - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0 - bne _080584BE - movs r0, 0 - b _080584C0 -_080584B8: - ldrh r0, [r4, 0xA] - adds r0, 0x1 - strh r0, [r4, 0xA] -_080584BE: - movs r0, 0x1 -_080584C0: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8058464 - - thumb_func_start task50_overworld_door -task50_overworld_door: @ 80584C8 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r2, r4, 2 - adds r2, r4 - lsls r2, 3 - ldr r0, _080584FC @ =gTasks + 0x8 - adds r2, r0 - ldrh r1, [r2] - lsls r1, 16 - ldrh r0, [r2, 0x2] - orrs r1, r0 - ldrh r0, [r2, 0x4] - lsls r0, 16 - ldrh r3, [r2, 0x6] - orrs r0, r3 - bl sub_8058464 - cmp r0, 0 - bne _080584F6 - adds r0, r4, 0 - bl DestroyTask -_080584F6: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080584FC: .4byte gTasks + 0x8 - thumb_func_end task50_overworld_door - - thumb_func_start door_frame_last -door_frame_last: @ 8058500 - push {lr} - adds r1, r0, 0 - b _08058508 -_08058506: - adds r1, 0x4 -_08058508: - ldrb r0, [r1] - cmp r0, 0 - bne _08058506 - subs r0, r1, 0x4 - pop {r1} - bx r1 - thumb_func_end door_frame_last - - thumb_func_start door_find -door_find: @ 8058514 - push {lr} - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - b _0805852A -_0805851E: - ldrh r0, [r2] - cmp r0, r1 - bne _08058528 - adds r0, r2, 0 - b _08058532 -_08058528: - adds r2, 0xC -_0805852A: - ldr r0, [r2, 0x4] - cmp r0, 0 - bne _0805851E - movs r0, 0 -_08058532: - pop {r1} - bx r1 - thumb_func_end door_find - - thumb_func_start task_overworld_door_add_if_inactive -task_overworld_door_add_if_inactive: @ 8058538 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r6, r0, 0 - adds r5, r1, 0 - adds r7, r2, 0 - mov r8, r3 - ldr r4, _08058584 @ =task50_overworld_door - adds r0, r4, 0 - bl FuncIsActiveTask - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _0805858C - adds r0, r4, 0 - movs r1, 0x50 - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r2, _08058588 @ =gTasks + 0x8 - adds r1, r2 - strh r7, [r1, 0xC] - mov r2, r8 - strh r2, [r1, 0xE] - strh r5, [r1, 0x2] - lsrs r2, r5, 16 - strh r2, [r1] - strh r6, [r1, 0x6] - lsrs r2, r6, 16 - strh r2, [r1, 0x4] - lsls r0, 24 - asrs r0, 24 - b _08058590 - .align 2, 0 -_08058584: .4byte task50_overworld_door -_08058588: .4byte gTasks + 0x8 -_0805858C: - movs r0, 0x1 - negs r0, r0 -_08058590: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end task_overworld_door_add_if_inactive - - thumb_func_start sub_805859C -sub_805859C: @ 805859C - push {lr} - adds r0, r1, 0 - adds r1, r2, 0 - bl sub_805840C - pop {r0} - bx r0 - thumb_func_end sub_805859C - - thumb_func_start sub_80585AC -sub_80585AC: @ 80585AC - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridGetMetatileIdAt - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r4, 0 - bl door_find - adds r4, r0, 0 - cmp r4, 0 - beq _080585E2 - ldr r1, _080585E8 @ =gUnknown_0830F87C - adds r0, r1, 0 - bl door_frame_last - adds r1, r0, 0 - adds r0, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl sub_8058428 -_080585E2: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080585E8: .4byte gUnknown_0830F87C - thumb_func_end sub_80585AC - - thumb_func_start sub_80585EC -sub_80585EC: @ 80585EC - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridGetMetatileIdAt - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r4, 0 - bl door_find - cmp r0, 0 - beq _08058620 - ldr r1, _0805861C @ =gUnknown_0830F87C - adds r2, r5, 0 - adds r3, r6, 0 - bl task_overworld_door_add_if_inactive - lsls r0, 24 - asrs r0, 24 - b _08058624 - .align 2, 0 -_0805861C: .4byte gUnknown_0830F87C -_08058620: - movs r0, 0x1 - negs r0, r0 -_08058624: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80585EC - - thumb_func_start sub_805862C -sub_805862C: @ 805862C - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r0, r5, 0 - adds r1, r6, 0 - bl MapGridGetMetatileIdAt - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r4, 0 - bl door_find - cmp r0, 0 - beq _08058660 - ldr r1, _0805865C @ =gUnknown_0830F890 - adds r2, r5, 0 - adds r3, r6, 0 - bl task_overworld_door_add_if_inactive - lsls r0, 24 - asrs r0, 24 - b _08058664 - .align 2, 0 -_0805865C: .4byte gUnknown_0830F890 -_08058660: - movs r0, 0x1 - negs r0, r0 -_08058664: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_805862C - - thumb_func_start cur_mapdata_get_door_x2_at -cur_mapdata_get_door_x2_at: @ 805866C - push {r4,lr} - adds r4, r0, 0 - adds r0, r1, 0 - adds r1, r2, 0 - bl MapGridGetMetatileIdAt - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r4, 0 - bl door_find - cmp r0, 0 - beq _08058690 - ldrb r0, [r0, 0x2] - lsls r0, 24 - asrs r0, 24 - b _08058694 -_08058690: - movs r0, 0x1 - negs r0, r0 -_08058694: - pop {r4} - pop {r1} - bx r1 - thumb_func_end cur_mapdata_get_door_x2_at - - thumb_func_start unref_sub_805869C -unref_sub_805869C: @ 805869C - push {lr} - adds r3, r0, 0 - adds r2, r1, 0 - ldr r0, _080586B0 @ =gDoorAnimGraphicsTable - adds r1, r3, 0 - bl sub_80585EC - pop {r0} - bx r0 - .align 2, 0 -_080586B0: .4byte gDoorAnimGraphicsTable - thumb_func_end unref_sub_805869C - - thumb_func_start sub_80586B4 -sub_80586B4: @ 80586B4 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8056EAC - lsls r0, 24 - cmp r0, 0 - beq _080586D6 - ldr r0, _080586DC @ =gDoorAnimGraphicsTable - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_80585AC -_080586D6: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080586DC: .4byte gDoorAnimGraphicsTable - thumb_func_end sub_80586B4 - - thumb_func_start sub_80586E0 -sub_80586E0: @ 80586E0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8056EAC - lsls r0, 24 - cmp r0, 0 - beq _08058702 - ldr r0, _08058708 @ =gDoorAnimGraphicsTable - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_805859C -_08058702: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08058708: .4byte gDoorAnimGraphicsTable - thumb_func_end sub_80586E0 - - thumb_func_start sub_805870C -sub_805870C: @ 805870C - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8056EAC - lsls r0, 24 - cmp r0, 0 - beq _08058738 - ldr r0, _08058734 @ =gDoorAnimGraphicsTable - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_805862C - lsls r0, 24 - asrs r0, 24 - b _0805873C - .align 2, 0 -_08058734: .4byte gDoorAnimGraphicsTable -_08058738: - movs r0, 0x1 - negs r0, r0 -_0805873C: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_805870C - - thumb_func_start task_overworld_door_add_if_role_69_for_opening_door_at -task_overworld_door_add_if_role_69_for_opening_door_at: @ 8058744 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8056EAC - lsls r0, 24 - cmp r0, 0 - beq _08058770 - ldr r0, _0805876C @ =gDoorAnimGraphicsTable - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_80585EC - lsls r0, 24 - asrs r0, 24 - b _08058774 - .align 2, 0 -_0805876C: .4byte gDoorAnimGraphicsTable -_08058770: - movs r0, 0x1 - negs r0, r0 -_08058774: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end task_overworld_door_add_if_role_69_for_opening_door_at - - thumb_func_start sub_805877C -sub_805877C: @ 805877C - push {lr} - ldr r0, _0805878C @ =task50_overworld_door - bl FuncIsActiveTask - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - .align 2, 0 -_0805878C: .4byte task50_overworld_door - thumb_func_end sub_805877C - - thumb_func_start sub_8058790 -sub_8058790: @ 8058790 - push {lr} - adds r3, r0, 0 - adds r2, r1, 0 - ldr r0, _080587A8 @ =gDoorAnimGraphicsTable - adds r1, r3, 0 - bl cur_mapdata_get_door_x2_at - lsls r0, 24 - cmp r0, 0 - beq _080587AC - movs r0, 0x12 - b _080587AE - .align 2, 0 -_080587A8: .4byte gDoorAnimGraphicsTable -_080587AC: - movs r0, 0x8 -_080587AE: - pop {r1} - bx r1 - thumb_func_end sub_8058790 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/metatile_behavior.s b/asm/metatile_behavior.s index 0217bf6c0..f81e3c0d4 100644 --- a/asm/metatile_behavior.s +++ b/asm/metatile_behavior.s @@ -212,8 +212,8 @@ _08056EA8: bx r1 thumb_func_end is_tile_x69_2_warp_door - thumb_func_start sub_8056EAC -sub_8056EAC: @ 8056EAC + thumb_func_start MetatileBehavior_IsDoor +MetatileBehavior_IsDoor: @ 8056EAC push {lr} lsls r0, 24 lsrs r0, 24 @@ -229,7 +229,7 @@ _08056EBE: _08056EC0: pop {r1} bx r1 - thumb_func_end sub_8056EAC + thumb_func_end MetatileBehavior_IsDoor thumb_func_start MetatileBehavior_IsEscalator MetatileBehavior_IsEscalator: @ 8056EC4 diff --git a/asm/rom_8080874.s b/asm/rom_8080874.s index f672bd3cb..d4a6414fb 100644 --- a/asm/rom_8080874.s +++ b/asm/rom_8080874.s @@ -346,7 +346,7 @@ sub_8080AE4: @ 8080AE4 lsls r0, 24 lsrs r4, r0, 24 adds r0, r4, 0 - bl sub_8056EAC + bl MetatileBehavior_IsDoor lsls r0, 24 lsrs r0, 24 cmp r0, 0x1 @@ -461,7 +461,7 @@ _08080BE4: ldrsh r0, [r6, r1] movs r2, 0 ldrsh r1, [r7, r2] - bl sub_80586B4 + bl FieldSetDoorOpened movs r0, 0x1 strh r0, [r5, 0x8] b _08080CAE @@ -499,7 +499,7 @@ _08080C40: ldrsh r0, [r6, r1] movs r2, 0 ldrsh r1, [r7, r2] - bl sub_805870C + bl FieldAnimateDoorClose lsls r0, 24 asrs r0, 24 strh r0, [r5, 0xA] @@ -1201,7 +1201,7 @@ _080811A8: movs r2, 0 ldrsh r1, [r6, r2] subs r1, 0x1 - bl task_overworld_door_add_if_role_69_for_opening_door_at + bl FieldAnimateDoorOpen lsls r0, 24 asrs r0, 24 strh r0, [r5, 0xA] @@ -1262,7 +1262,7 @@ _08081240: movs r2, 0 ldrsh r1, [r6, r2] subs r1, 0x1 - bl sub_805870C + bl FieldAnimateDoorClose lsls r0, 24 asrs r0, 24 strh r0, [r5, 0xA] diff --git a/data/data2.s b/data/data2.s index a64838ec8..abc0ff1e3 100644 --- a/data/data2.s +++ b/data/data2.s @@ -4434,14 +4434,14 @@ DoorAnimTiles_33: @ 830F55C .space 32 -gUnknown_0830F87C:: @ 830F87C +gDoorOpenAnimFrames:: @ 830F87C door_anim_frame 4, -1 door_anim_frame 4, 0 door_anim_frame 4, 0x100 door_anim_frame 4, 0x200 door_anim_frame 0, 0 -gUnknown_0830F890:: @ 830F890 +gDoorCloseAnimFrames:: @ 830F890 door_anim_frame 4, 0x200 door_anim_frame 4, 0x100 door_anim_frame 4, 0 diff --git a/ld_script.txt b/ld_script.txt index c00e02e01..9d6400cc0 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -69,7 +69,7 @@ SECTIONS { asm/fieldmap.o(.text); asm/metatile_behavior.o(.text); asm/field_camera.o(.text); - asm/field_door.o(.text); + src/field_door.o(.text); asm/field_player_avatar.o(.text); asm/field_map_obj.o(.text); asm/field_ground_effect.o(.text); diff --git a/src/field_door.c b/src/field_door.c new file mode 100644 index 000000000..68c884af1 --- /dev/null +++ b/src/field_door.c @@ -0,0 +1,233 @@ +#include "global.h" +#include "task.h" + +extern u8 MetatileBehavior_IsDoor(u8); + +struct DoorGraphics +{ + u16 metatileNum; + u8 unk2; + void *tiles; + void *palette; +}; + +struct DoorAnimFrame +{ + u8 time; + u16 offset; +}; + +extern struct DoorAnimFrame gDoorOpenAnimFrames[]; +extern struct DoorAnimFrame gDoorCloseAnimFrames[]; +extern struct DoorGraphics gDoorAnimGraphicsTable[]; + +static void CopyDoorTilesToVram(void *src) +{ + CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40); +} + +static void door_build_blockdef(u16 *a, u16 b, u8 *c) +{ + int i; + u16 unk; + + for (i = 0; i < 4; i++) + { + unk = *(c++) << 12; + a[i] = unk | (b + i); + } + for (; i < 8; i++) + { + unk = *(c++) << 12; + a[i] = unk; + } +} + +static void DrawCurrentDoorAnimFrame(u32 x, u32 y, u8 *c) +{ + u16 arr[8]; + + door_build_blockdef(arr, 0x3F8, c); + DrawDoorMetatileAt(x, y - 1, arr); + door_build_blockdef(arr, 0x3FC, c + 4); + DrawDoorMetatileAt(x, y, arr); +} + +static void DrawClosedDoorTiles(u32 x, u32 y) +{ + CurrentMapDrawMetatileAt(x, y - 1); + CurrentMapDrawMetatileAt(x, y); +} + +static void DrawDoor(struct DoorGraphics *gfx, struct DoorAnimFrame *frame, u32 x, u32 y) +{ + if (frame->offset == 0xFFFF) + DrawClosedDoorTiles(x, y); + else + { + CopyDoorTilesToVram(gfx->tiles + frame->offset); + DrawCurrentDoorAnimFrame(x, y, gfx->palette); + } +} + +enum +{ + TD_FRAMELIST = 0, + TD_GFX = 2, + TD_FRAME = 4, + TD_COUNTER, + TD_X, + TD_Y +}; + +static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) +{ + if (taskData[TD_COUNTER] == 0) + DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); + if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) + { + taskData[TD_COUNTER] = 0; + taskData[TD_FRAME]++; + if (frames[taskData[TD_FRAME]].time == 0) + return FALSE; + else + return TRUE; + } + taskData[TD_COUNTER]++; + return TRUE; +} + +static void Task_AnimateDoor(u8 taskId) +{ + u16 *taskData = gTasks[taskId].data; + struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); + struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); + + if (sub_8058464(gfx, frames, taskData) == FALSE) + DestroyTask(taskId); +} + +static struct DoorAnimFrame *GetLastDoorFrame(struct DoorAnimFrame *frame, void *unused) +{ + while (frame->time != 0) + frame++; + return frame - 1; +} + +static struct DoorGraphics *GetDoorGraphics(struct DoorGraphics *gfx, u16 metatileNum) +{ + while (gfx->tiles != NULL) + { + if (gfx->metatileNum == metatileNum) + return gfx; + gfx++; + } + return NULL; +} + +static s8 StartDoorAnimationTask(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, u32 x, u32 y) +{ + if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) + return -1; + else + { + u8 taskId = CreateTask(Task_AnimateDoor, 0x50); + s16 *taskData = gTasks[taskId].data; + + taskData[TD_X] = x; + taskData[TD_Y] = y; + + taskData[TD_FRAMELIST + 1] = (u32)frames; + taskData[TD_FRAMELIST] = (u32)frames >> 16; + + taskData[TD_GFX + 1] = (u32)gfx; + taskData[TD_GFX] = (u32)gfx >> 16; + + return taskId; + } +} + +static void DrawClosedDoor(struct DoorGraphics *unused, u32 x, u32 y) +{ + DrawClosedDoorTiles(x, y); +} + +static void DrawOpenedDoor(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx != NULL) + DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y); +} + +static s8 StartDoorOpenAnimation(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y); +} + +static s8 StartDoorCloseAnimation(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y); +} + +static s8 cur_mapdata_get_door_x2_at(struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return gfx->unk2; +} + +static void unref_sub_805869C(u32 x, u32 y) +{ + StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorOpened(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawOpenedDoor(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorClosed(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawClosedDoor(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorClose(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorOpen(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +bool8 FieldIsDoorAnimationRunning(void) +{ + return FuncIsActiveTask(Task_AnimateDoor); +} + +u8 sub_8058790(u32 x, u32 y) +{ + if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0) + return 8; + else + return 18; +} diff --git a/src/rom4.c b/src/rom4.c index d7bd9b7a3..15041cb39 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -172,7 +172,7 @@ u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8, u16, u8); u8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8); bool8 sub_8056F24(u8); bool8 sub_8056F08(u8); -bool8 sub_8056EAC(u8); +bool8 MetatileBehavior_IsDoor(u8); bool8 MetatileBehavior_IsSouthArrowWarp(u8); bool8 MetatileBehavior_IsNorthArrowWarp(u8); bool8 MetatileBehavior_IsWestArrowWarp(u8); @@ -769,7 +769,7 @@ u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) return 4; if (sub_8056F24(a3) == TRUE) return 2; - if (sub_8056F08(a3) == TRUE || sub_8056EAC(a3) == TRUE) + if (sub_8056F08(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE) return 1; if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) return 2; diff --git a/src/scrcmd.c b/src/scrcmd.c index aa6fdd5ed..9d6f36a54 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -123,11 +123,11 @@ extern bool8 FieldEffectActiveListContains(u8); extern void sub_8053588(u8); extern void MapGridSetMetatileIdAt(u32, u32, u16); extern u16 sub_8058790(u32, u32); -extern bool8 task_overworld_door_add_if_role_69_for_opening_door_at(u32, u32); -extern bool8 sub_805870C(u32, u32); -extern bool8 sub_805877C(void); -extern void sub_80586B4(u32, u32); -extern void sub_80586E0(u32, u32); +extern bool8 FieldAnimateDoorOpen(u32, u32); +extern bool8 FieldAnimateDoorClose(u32, u32); +extern bool8 FieldIsDoorAnimationRunning(void); +extern void FieldSetDoorOpened(u32, u32); +extern void FieldSetDoorClosed(u32, u32); extern void ScriptAddElevatorMenuItem(u8, u8, u8, u8); extern void ScriptShowElevatorMenu(void); extern u16 GetCoins(void); @@ -1871,28 +1871,28 @@ bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) { - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - v3 += 7; - v4 += 7; - PlaySE(sub_8058790(v3, v4)); - task_overworld_door_add_if_role_69_for_opening_door_at(v3, v4); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + PlaySE(sub_8058790(x, y)); + FieldAnimateDoorOpen(x, y); return FALSE; } bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) { - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - v3 += 7; - v5 += 7; - sub_805870C(v3, v5); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldAnimateDoorClose(x, y); return FALSE; } -bool8 sub_8067D2C() +bool8 IsDoorAnimationStopped() { - if (!sub_805877C()) + if (!FieldIsDoorAnimationRunning()) return TRUE; else return FALSE; @@ -1900,27 +1900,27 @@ bool8 sub_8067D2C() bool8 ScrCmd_doorchange(struct ScriptContext *ctx) { - SetupNativeScript(ctx, sub_8067D2C); + SetupNativeScript(ctx, IsDoorAnimationStopped); return TRUE; } bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) { - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - v3 += 7; - v5 += 7; - sub_80586B4(v3, v5); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldSetDoorOpened(x, y); return FALSE; } bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) { - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - v3 += 7; - v5 += 7; - sub_80586E0(v3, v5); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; + y += 7; + FieldSetDoorClosed(x, y); return FALSE; } |