summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_door.s613
-rw-r--r--asm/metatile_behavior.s6
-rw-r--r--asm/rom_8080874.s10
-rw-r--r--data/data2.s4
-rw-r--r--ld_script.txt2
-rw-r--r--src/field_door.c233
-rw-r--r--src/rom4.c4
-rw-r--r--src/scrcmd.c58
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;
}