From 4cffc35604b55f1bdd8cbecbc52cdd65532c1a63 Mon Sep 17 00:00:00 2001 From: theo3 Date: Sun, 12 Jul 2020 15:54:01 -0700 Subject: [PATCH] railtrack.c --- asm/guardWithSpear.s | 470 -------------------- asm/non_matching/guard/sub_08063D44.inc | 69 +++ asm/non_matching/guard/sub_08063E90.inc | 73 +++ asm/non_matching/railtrack/sub_08085394.inc | 87 ++++ asm/non_matching/railtrack/sub_080854A8.inc | 36 ++ asm/railtrack.s | 438 ------------------ include/entity.h | 1 + linker.ld | 3 +- src/guard.c | 196 ++++++++ src/railtrack.c | 148 ++++++ 10 files changed, 612 insertions(+), 909 deletions(-) create mode 100644 asm/non_matching/guard/sub_08063D44.inc create mode 100644 asm/non_matching/guard/sub_08063E90.inc create mode 100644 asm/non_matching/railtrack/sub_08085394.inc create mode 100644 asm/non_matching/railtrack/sub_080854A8.inc delete mode 100644 asm/railtrack.s create mode 100644 src/guard.c create mode 100644 src/railtrack.c diff --git a/asm/guardWithSpear.s b/asm/guardWithSpear.s index e9456371..745374ba 100644 --- a/asm/guardWithSpear.s +++ b/asm/guardWithSpear.s @@ -6,476 +6,6 @@ .text - - thumb_func_start Guard -Guard: @ 0x08063CF8 - push {lr} - adds r2, r0, #0 - ldrb r1, [r2, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08063D1C - ldr r0, _08063D18 @ =gUnk_0810F544 - ldrb r1, [r2, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r2, #0 - bl _call_via_r1 - b _08063D22 - .align 2, 0 -_08063D18: .4byte gUnk_0810F544 -_08063D1C: - adds r0, r2, #0 - bl sub_08063D24 -_08063D22: - pop {pc} - - thumb_func_start sub_08063D24 -sub_08063D24: @ 0x08063D24 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08063D40 @ =gUnk_0810F550 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_0806ED78 - pop {r4, pc} - .align 2, 0 -_08063D40: .4byte gUnk_0810F550 - - thumb_func_start sub_08063D44 -sub_08063D44: @ 0x08063D44 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08063DA0 @ =gUnk_03003DBC - ldrb r0, [r0] - cmp r0, #0x46 - bhi _08063DC6 - ldrb r0, [r4, #9] - movs r1, #0x15 - eors r0, r1 - rsbs r1, r0, #0 - orrs r1, r0 - lsrs r1, r1, #0x1f - lsls r1, r1, #4 - ldr r0, _08063DA4 @ =gUnk_0810F524 - adds r1, r1, r0 - adds r0, r4, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _08063DC6 - adds r0, r4, #0 - movs r1, #4 - bl InitializeAnimation - ldr r0, _08063DA8 @ =gUnk_0810F6BC - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - movs r2, #0 - bl sub_0806EE04 - ldrb r0, [r4, #0xa] - cmp r0, #0 - blt _08063DB6 - cmp r0, #3 - bgt _08063DAC - movs r0, #0xc - bl sub_080A7EE0 - str r4, [r0, #0x50] - movs r1, #0x3c - strb r1, [r0, #0xf] - b _08063DB6 - .align 2, 0 -_08063DA0: .4byte gUnk_03003DBC -_08063DA4: .4byte gUnk_0810F524 -_08063DA8: .4byte gUnk_0810F6BC -_08063DAC: - cmp r0, #5 - bgt _08063DB6 - adds r0, r4, #0 - bl sub_08078778 -_08063DB6: - ldrb r0, [r4, #0xc] - adds r0, #1 - movs r1, #0 - strb r0, [r4, #0xc] - strb r1, [r4, #0xa] - adds r0, r4, #0 - bl sub_08063DC8 -_08063DC6: - pop {r4, pc} - - thumb_func_start sub_08063DC8 -sub_08063DC8: @ 0x08063DC8 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0xff - bne _08063DF8 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xe] - ldr r1, _08063DF4 @ =gLinkEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _08063E4C - .align 2, 0 -_08063DF4: .4byte gLinkEntity -_08063DF8: - adds r0, r4, #0 - bl sub_0806EE20 - adds r0, r4, #0 - adds r0, #0x3e - ldrb r0, [r0] - ldrb r1, [r4, #0x14] - cmp r0, r1 - beq _08063E18 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitializeAnimation - b _08063E1E -_08063E18: - adds r0, r4, #0 - bl GetNextFrame -_08063E1E: - adds r2, r4, #0 - adds r2, #0x39 - movs r0, #0 - ldrsb r0, [r2, r0] - cmp r0, #0 - beq _08063E4C - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r2] - ldr r1, _08063E50 @ =gLinkEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08064428 -_08063E4C: - pop {r4, pc} - .align 2, 0 -_08063E50: .4byte gLinkEntity - - thumb_func_start sub_08063E54 -sub_08063E54: @ 0x08063E54 - push {lr} - ldrb r1, [r0, #0xe] - subs r1, #1 - strb r1, [r0, #0xe] - lsls r1, r1, #0x18 - cmp r1, #0 - bne _08063E68 - movs r0, #0xf - bl SetRoomFlag -_08063E68: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08063E6C -sub_08063E6C: @ 0x08063E6C - push {lr} - adds r2, r0, #0 - ldr r0, _08063E8C @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08063E8A - movs r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x14] - adds r1, #4 - adds r0, r2, #0 - bl InitializeAnimation -_08063E8A: - pop {pc} - .align 2, 0 -_08063E8C: .4byte gTextBox - - thumb_func_start sub_08063E90 -sub_08063E90: @ 0x08063E90 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #9] - movs r1, #0x15 - eors r0, r1 - rsbs r1, r0, #0 - orrs r1, r0 - lsrs r1, r1, #0x1f - lsls r1, r1, #4 - ldr r0, _08063EC8 @ =gUnk_0810F524 - adds r1, r1, r0 - adds r0, r4, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _08063F1E - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0xe] - cmp r1, #0 - beq _08063ECC - adds r1, r4, #0 - adds r1, #0x70 - movs r0, #8 - strb r0, [r1] - b _08063ED2 - .align 2, 0 -_08063EC8: .4byte gUnk_0810F524 -_08063ECC: - adds r0, r4, #0 - adds r0, #0x70 - strb r1, [r0] -_08063ED2: - movs r0, #0 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_0805ACC0 - adds r2, r0, #0 - cmp r2, #0 - bne _08063EF2 - ldrh r0, [r4, #0x2e] - adds r1, r4, #0 - adds r1, #0x68 - strh r0, [r1] - ldrh r0, [r4, #0x32] - adds r1, #2 - strh r0, [r1] - b _08063EFE -_08063EF2: - lsrs r1, r2, #0x10 - adds r0, r4, #0 - adds r0, #0x68 - strh r1, [r0] - adds r0, #2 - strh r2, [r0] -_08063EFE: - adds r1, r4, #0 - adds r1, #0x71 - movs r0, #0 - strb r0, [r1] - subs r1, #0x39 - movs r0, #1 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - bl sub_0807DD64 - adds r0, r4, #0 - bl sub_08063F20 -_08063F1E: - pop {r4, pc} - - thumb_func_start sub_08063F20 -sub_08063F20: @ 0x08063F20 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0 - bl sub_0807DDAC - adds r0, r4, #0 - bl sub_0807DDE4 - adds r0, r4, #0 - bl GetNextFrame - adds r2, r4, #0 - adds r2, #0x39 - movs r0, #0 - ldrsb r0, [r2, r0] - cmp r0, #0 - beq _08063F72 - ldrb r0, [r4, #0xc] - adds r0, #1 - movs r1, #0 - strb r0, [r4, #0xc] - strb r1, [r2] - ldr r1, _08063F74 @ =gLinkEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - adds r0, #0x70 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r1, r1, r0 - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08064428 -_08063F72: - pop {r4, pc} - .align 2, 0 -_08063F74: .4byte gLinkEntity - - thumb_func_start sub_08063F78 -sub_08063F78: @ 0x08063F78 - push {lr} - adds r2, r0, #0 - ldr r0, _08063FA8 @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08063FA6 - ldrb r0, [r2, #0xc] - subs r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x14] - lsrs r1, r1, #1 - adds r0, r2, #0 - adds r0, #0x70 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r0, #4 - adds r1, r1, r0 - adds r0, r2, #0 - bl InitializeAnimation -_08063FA6: - pop {pc} - .align 2, 0 -_08063FA8: .4byte gTextBox - - thumb_func_start Guard_Head -Guard_Head: @ 0x08063FAC - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x3f - adds r2, r0, #0 - ands r2, r1 - ldrb r3, [r6, #0x1e] - adds r5, r0, #0 - ands r5, r3 - adds r1, r6, #0 - adds r1, #0x5b - ldrb r1, [r1] - adds r4, r0, #0 - ands r4, r1 - ldrb r0, [r6, #9] - cmp r0, #0x15 - bne _08063FEC - movs r0, #0x40 - ands r0, r3 - cmp r0, #0 - beq _08063FE2 - adds r5, #0x21 - movs r2, #1 - rsbs r2, r2, #0 - movs r4, #0 - b _08063FF6 -_08063FE2: - adds r2, #0x19 - cmp r4, #0 - beq _08063FF6 - adds r4, #0x1f - b _08063FF6 -_08063FEC: - adds r2, #0x46 - adds r5, #0x2d - cmp r4, #0 - beq _08063FF6 - adds r4, #0x4c -_08063FF6: - subs r4, #1 - adds r0, r6, #0 - movs r1, #0 - bl SetExtraSpriteFrame - adds r0, r6, #0 - movs r1, #1 - adds r2, r5, #0 - bl SetExtraSpriteFrame - adds r0, r6, #0 - movs r1, #2 - adds r2, r4, #0 - bl SetExtraSpriteFrame - adds r0, r6, #0 - movs r1, #1 - movs r2, #0 - bl SetSpriteSubEntryOffsetData1 - adds r0, r6, #0 - movs r1, #1 - movs r2, #2 - bl SetSpriteSubEntryOffsetData2 - adds r0, r6, #0 - bl sub_0807000C - pop {r4, r5, r6, pc} - - thumb_func_start sub_08064030 -sub_08064030: @ 0x08064030 - ldr r0, _08064040 @ =gRoomVars - ldr r2, [r0, #0x68] - rsbs r0, r2, #0 - orrs r0, r2 - lsrs r0, r0, #0x1f - str r0, [r1, #0x14] - bx lr - .align 2, 0 -_08064040: .4byte gRoomVars - - thumb_func_start sub_08064044 -sub_08064044: @ 0x08064044 - ldr r1, _0806404C @ =gUnk_030010A0 - movs r0, #1 - strb r0, [r1, #8] - bx lr - .align 2, 0 -_0806404C: .4byte gUnk_030010A0 - - thumb_func_start sub_08064050 -sub_08064050: @ 0x08064050 - push {lr} - adds r2, r1, #0 - movs r1, #0 - str r1, [r2, #4] - ldrb r0, [r0, #0xb] - cmp r0, #0x12 - beq _08064072 - cmp r0, #0x12 - bgt _08064068 - cmp r0, #0x11 - beq _0806406E - b _0806407A -_08064068: - cmp r0, #0x13 - beq _08064076 - b _0806407A -_0806406E: - movs r0, #1 - b _08064078 -_08064072: - movs r0, #2 - b _08064078 -_08064076: - movs r0, #3 -_08064078: - str r0, [r2, #4] -_0806407A: - pop {pc} - thumb_func_start sub_0806407C sub_0806407C: @ 0x0806407C push {r4, r5, r6, lr} diff --git a/asm/non_matching/guard/sub_08063D44.inc b/asm/non_matching/guard/sub_08063D44.inc new file mode 100644 index 00000000..201f79c0 --- /dev/null +++ b/asm/non_matching/guard/sub_08063D44.inc @@ -0,0 +1,69 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, lr} + adds r4, r0, #0 + ldr r0, _08063DA0 @ =gUnk_03003DBC + ldrb r0, [r0] + cmp r0, #0x46 + bhi _08063DC6 + ldrb r0, [r4, #9] + movs r1, #0x15 + eors r0, r1 + rsbs r1, r0, #0 + orrs r1, r0 + lsrs r1, r1, #0x1f + lsls r1, r1, #4 + ldr r0, _08063DA4 @ =gUnk_0810F524 + adds r1, r1, r0 + adds r0, r4, #0 + bl LoadExtraSpriteData + cmp r0, #0 + beq _08063DC6 + adds r0, r4, #0 + movs r1, #4 + bl InitializeAnimation + ldr r0, _08063DA8 @ =gUnk_0810F6BC + ldrb r1, [r4, #0xa] + lsls r1, r1, #2 + adds r1, r1, r0 + ldr r1, [r1] + adds r0, r4, #0 + movs r2, #0 + bl sub_0806EE04 + ldrb r0, [r4, #0xa] + cmp r0, #0 + blt _08063DB6 + cmp r0, #3 + bgt _08063DAC + movs r0, #0xc + bl sub_080A7EE0 + str r4, [r0, #0x50] + movs r1, #0x3c + strb r1, [r0, #0xf] + b _08063DB6 + .align 2, 0 +_08063DA0: .4byte gUnk_03003DBC +_08063DA4: .4byte gUnk_0810F524 +_08063DA8: .4byte gUnk_0810F6BC +_08063DAC: + cmp r0, #5 + bgt _08063DB6 + adds r0, r4, #0 + bl sub_08078778 +_08063DB6: + ldrb r0, [r4, #0xc] + adds r0, #1 + movs r1, #0 + strb r0, [r4, #0xc] + strb r1, [r4, #0xa] + adds r0, r4, #0 + bl sub_08063DC8 +_08063DC6: + pop {r4, pc} + .syntax divided \ No newline at end of file diff --git a/asm/non_matching/guard/sub_08063E90.inc b/asm/non_matching/guard/sub_08063E90.inc new file mode 100644 index 00000000..76e3d4a5 --- /dev/null +++ b/asm/non_matching/guard/sub_08063E90.inc @@ -0,0 +1,73 @@ + .syntax unified + push {r4, lr} + adds r4, r0, #0 + ldrb r0, [r4, #9] + movs r1, #0x15 + eors r0, r1 + rsbs r1, r0, #0 + orrs r1, r0 + lsrs r1, r1, #0x1f + lsls r1, r1, #4 + ldr r0, _08063EC8 @ =gUnk_0810F524 + adds r1, r1, r0 + adds r0, r4, #0 + bl LoadExtraSpriteData + cmp r0, #0 + beq _08063F1E + ldrb r0, [r4, #0xc] + adds r0, #1 + strb r0, [r4, #0xc] + ldrb r1, [r4, #0xe] + cmp r1, #0 + beq _08063ECC + adds r1, r4, #0 + adds r1, #0x70 + movs r0, #8 + strb r0, [r1] + b _08063ED2 + .align 2, 0 +_08063EC8: .4byte gUnk_0810F524 +_08063ECC: + adds r0, r4, #0 + adds r0, #0x70 + strb r1, [r0] +_08063ED2: + movs r0, #0 + strb r0, [r4, #0xe] + adds r0, r4, #0 + bl sub_0805ACC0 + adds r2, r0, #0 + cmp r2, #0 + bne _08063EF2 + ldrh r0, [r4, #0x2e] + adds r1, r4, #0 + adds r1, #0x68 + strh r0, [r1] + ldrh r0, [r4, #0x32] + adds r1, #2 + strh r0, [r1] + b _08063EFE +_08063EF2: + lsrs r1, r2, #0x10 + adds r0, r4, #0 + adds r0, #0x68 + strh r1, [r0] + adds r0, #2 + strh r2, [r0] +_08063EFE: + adds r1, r4, #0 + adds r1, #0x71 + movs r0, #0 + strb r0, [r1] + subs r1, #0x39 + movs r0, #1 + strb r0, [r1] + adds r0, r4, #0 + bl UpdateSpriteForCollisionLayer + adds r0, r4, #0 + bl sub_0807DD64 + adds r0, r4, #0 + bl sub_08063F20 +_08063F1E: + pop {r4, pc} + .syntax divided \ No newline at end of file diff --git a/asm/non_matching/railtrack/sub_08085394.inc b/asm/non_matching/railtrack/sub_08085394.inc new file mode 100644 index 00000000..9a2ba760 --- /dev/null +++ b/asm/non_matching/railtrack/sub_08085394.inc @@ -0,0 +1,87 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + adds r7, r0, #0 + ldr r0, _08085430 @ =gUnk_081205E0 + ldrb r2, [r7, #0x14] + lsrs r2, r2, #1 + lsls r2, r2, #1 + adds r0, r2, r0 + ldrh r0, [r0] + mov sl, r0 + ldr r0, _08085434 @ =gUnk_080B4488 + adds r2, r2, r0 + ldr r0, [r7, #0x70] + mov sb, r0 + movs r1, #0x2e + ldrsh r4, [r7, r1] + ldr r1, _08085438 @ =gRoomControls + ldrh r0, [r1, #6] + subs r4, r4, r0 + asrs r4, r4, #4 + movs r3, #0x3f + ands r4, r3 + movs r5, #0x32 + ldrsh r0, [r7, r5] + ldrh r1, [r1, #8] + subs r0, r0, r1 + asrs r0, r0, #4 + ands r0, r3 + lsls r0, r0, #6 + orrs r4, r0 + ldrb r2, [r2] + lsls r2, r2, #0x18 + asrs r2, r2, #0x18 + mov r8, r2 + lsls r5, r2, #1 + mov r1, sb + subs r0, r1, r5 + ldrh r1, [r0] + adds r0, r7, #0 + adds r0, #0x74 + strh r1, [r0] + subs r1, r4, r2 + adds r6, r7, #0 + adds r6, #0x38 + ldrb r2, [r6] + mov r0, sl + bl SetTile + mov r1, sb + ldrh r0, [r1] + adds r1, r7, #0 + adds r1, #0x76 + strh r0, [r1] + ldrb r2, [r6] + mov r0, sl + adds r1, r4, #0 + bl SetTile + add r5, sb + ldrh r1, [r5] + adds r0, r7, #0 + adds r0, #0x78 + strh r1, [r0] + add r4, r8 + ldrb r2, [r6] + mov r0, sl + adds r1, r4, #0 + bl SetTile + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_08085430: .4byte gUnk_081205E0 +_08085434: .4byte gUnk_080B4488 +_08085438: .4byte gRoomControls + .syntax divided \ No newline at end of file diff --git a/asm/non_matching/railtrack/sub_080854A8.inc b/asm/non_matching/railtrack/sub_080854A8.inc new file mode 100644 index 00000000..aa5bed89 --- /dev/null +++ b/asm/non_matching/railtrack/sub_080854A8.inc @@ -0,0 +1,36 @@ + .syntax unified + push {r4, lr} + ldr r2, _080854E0 @ =gUnk_081205E0 + ldrb r1, [r0, #0x14] + lsrs r1, r1, #1 + lsls r1, r1, #1 + adds r2, r1, r2 + ldrh r3, [r2] + adds r4, r3, #0 + ldr r2, _080854E4 @ =gUnk_080B4488 + adds r1, r1, r2 + ldr r2, [r0, #0x70] + movs r0, #0 + ldrsb r0, [r1, r0] + lsls r1, r0, #1 + subs r0, r2, r1 + ldrh r0, [r0] + cmp r3, r0 + bne _080854E8 + ldrh r0, [r2] + cmp r3, r0 + bne _080854E8 + adds r0, r1, r2 + ldrh r0, [r0] + cmp r4, r0 + bne _080854E8 + movs r0, #0 + b _080854EA + .align 2, 0 +_080854E0: .4byte gUnk_081205E0 +_080854E4: .4byte gUnk_080B4488 +_080854E8: + movs r0, #1 +_080854EA: + pop {r4, pc} + .syntax divided \ No newline at end of file diff --git a/asm/railtrack.s b/asm/railtrack.s deleted file mode 100644 index 6fa8b595..00000000 --- a/asm/railtrack.s +++ /dev/null @@ -1,438 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Railtrack -Railtrack: @ 0x08085194 - push {lr} - ldr r2, _080851A8 @ =gUnk_081205D0 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080851A8: .4byte gUnk_081205D0 - - thumb_func_start sub_080851AC -sub_080851AC: @ 0x080851AC - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r2, #1 - movs r3, #1 - strb r3, [r5, #0xc] - ldrb r1, [r5, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - orrs r0, r2 - strb r0, [r5, #0x18] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - ldrb r1, [r5, #0xb] - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _080851E8 - adds r1, r5, #0 - adds r1, #0x7c - ldr r0, _080851E4 @ =0x0000FFFF - strh r0, [r1] - b _080851EE - .align 2, 0 -_080851E4: .4byte 0x0000FFFF -_080851E8: - adds r0, r5, #0 - adds r0, #0x7c - strh r3, [r0] -_080851EE: - ldrb r1, [r5, #0xb] - movs r0, #2 - ands r0, r1 - strb r0, [r5, #0x14] - ldrb r4, [r5, #0xa] - cmp r4, #3 - bne _0808521E - adds r0, r5, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - adds r1, r5, #0 - adds r1, #0x7a - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0808521E - ldrb r0, [r5, #0x14] - adds r0, #2 - movs r1, #3 - ands r0, r1 - strb r0, [r5, #0x14] - strb r4, [r5, #0xc] -_0808521E: - ldrb r1, [r5, #0x14] - adds r0, r5, #0 - bl InitializeAnimation - adds r0, r5, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - movs r1, #0x2e - ldrsh r2, [r5, r1] - ldr r3, _08085260 @ =gRoomControls - ldrh r1, [r3, #6] - subs r2, r2, r1 - asrs r2, r2, #4 - movs r4, #0x3f - ands r2, r4 - movs r6, #0x32 - ldrsh r1, [r5, r6] - ldrh r3, [r3, #8] - subs r1, r1, r3 - asrs r1, r1, #4 - ands r1, r4 - lsls r1, r1, #6 - orrs r2, r1 - lsls r2, r2, #1 - adds r2, #4 - adds r0, r0, r2 - str r0, [r5, #0x70] - adds r0, r5, #0 - bl sub_08085394 - pop {r4, r5, r6, pc} - .align 2, 0 -_08085260: .4byte gRoomControls - - thumb_func_start sub_08085264 -sub_08085264: @ 0x08085264 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r4, #0 - adds r5, #0x86 - ldrh r0, [r5] - bl CheckFlags - cmp r0, #0 - beq _080852AE - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #8 - strb r0, [r4, #0xf] - ldrb r0, [r4, #0xa] - cmp r0, #1 - bne _0808528A - ldrh r0, [r5] - bl ClearFlag -_0808528A: - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - ldrb r1, [r4, #0x14] - adds r0, r0, r1 - movs r1, #3 - ands r0, r1 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_0808543C - ldr r0, _080852B0 @ =0x00000151 - bl sub_08004488 -_080852AE: - pop {r4, r5, pc} - .align 2, 0 -_080852B0: .4byte 0x00000151 - - thumb_func_start sub_080852B4 -sub_080852B4: @ 0x080852B4 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xf] - subs r0, #1 - strb r0, [r5, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08085300 - movs r4, #3 - movs r0, #3 - strb r0, [r5, #0xc] - ldrb r0, [r5, #0xe] - strb r0, [r5, #0xf] - adds r0, r5, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - adds r1, r5, #0 - adds r1, #0x7a - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x7c - ldrb r0, [r0] - ldrb r1, [r5, #0x14] - adds r0, r0, r1 - ands r0, r4 - strb r0, [r5, #0x14] - ldrb r1, [r5, #0x14] - adds r0, r5, #0 - bl InitializeAnimation - adds r0, r5, #0 - bl sub_08085394 - ldr r0, _08085304 @ =0x00000151 - bl sub_08004488 -_08085300: - pop {r4, r5, pc} - .align 2, 0 -_08085304: .4byte 0x00000151 - - thumb_func_start sub_08085308 -sub_08085308: @ 0x08085308 - push {r4, lr} - adds r4, r0, #0 - bl sub_080854A8 - cmp r0, #0 - bne _0808538C - ldrb r0, [r4, #0xa] - cmp r0, #2 - beq _08085324 - cmp r0, #2 - ble _08085354 - cmp r0, #3 - beq _08085338 - b _08085354 -_08085324: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _08085354 - movs r0, #1 - strb r0, [r4, #0xc] - b _0808538C -_08085338: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - adds r1, r4, #0 - adds r1, #0x7a - ldrh r1, [r1] - cmp r0, r1 - bne _08085350 - movs r0, #0xff - b _08085352 -_08085350: - movs r0, #1 -_08085352: - strb r0, [r4, #0xf] -_08085354: - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808538C - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #8 - strb r0, [r4, #0xf] - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - ldrb r1, [r4, #0x14] - adds r0, r0, r1 - movs r1, #3 - ands r0, r1 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_0808543C - ldr r0, _08085390 @ =0x00000151 - bl sub_08004488 -_0808538C: - pop {r4, pc} - .align 2, 0 -_08085390: .4byte 0x00000151 - - thumb_func_start sub_08085394 -sub_08085394: @ 0x08085394 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r7, r0, #0 - ldr r0, _08085430 @ =gUnk_081205E0 - ldrb r2, [r7, #0x14] - lsrs r2, r2, #1 - lsls r2, r2, #1 - adds r0, r2, r0 - ldrh r0, [r0] - mov sl, r0 - ldr r0, _08085434 @ =gUnk_080B4488 - adds r2, r2, r0 - ldr r0, [r7, #0x70] - mov sb, r0 - movs r1, #0x2e - ldrsh r4, [r7, r1] - ldr r1, _08085438 @ =gRoomControls - ldrh r0, [r1, #6] - subs r4, r4, r0 - asrs r4, r4, #4 - movs r3, #0x3f - ands r4, r3 - movs r5, #0x32 - ldrsh r0, [r7, r5] - ldrh r1, [r1, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r4, r0 - ldrb r2, [r2] - lsls r2, r2, #0x18 - asrs r2, r2, #0x18 - mov r8, r2 - lsls r5, r2, #1 - mov r1, sb - subs r0, r1, r5 - ldrh r1, [r0] - adds r0, r7, #0 - adds r0, #0x74 - strh r1, [r0] - subs r1, r4, r2 - adds r6, r7, #0 - adds r6, #0x38 - ldrb r2, [r6] - mov r0, sl - bl SetTile - mov r1, sb - ldrh r0, [r1] - adds r1, r7, #0 - adds r1, #0x76 - strh r0, [r1] - ldrb r2, [r6] - mov r0, sl - adds r1, r4, #0 - bl SetTile - add r5, sb - ldrh r1, [r5] - adds r0, r7, #0 - adds r0, #0x78 - strh r1, [r0] - add r4, r8 - ldrb r2, [r6] - mov r0, sl - adds r1, r4, #0 - bl SetTile - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08085430: .4byte gUnk_081205E0 -_08085434: .4byte gUnk_080B4488 -_08085438: .4byte gRoomControls - - thumb_func_start sub_0808543C -sub_0808543C: @ 0x0808543C - push {r4, r5, r6, r7, lr} - adds r7, r0, #0 - ldr r0, _080854A0 @ =gUnk_080B4488 - ldrb r2, [r7, #0x14] - lsrs r2, r2, #1 - lsls r2, r2, #1 - adds r2, r2, r0 - movs r0, #0x2e - ldrsh r4, [r7, r0] - ldr r1, _080854A4 @ =gRoomControls - ldrh r0, [r1, #6] - subs r4, r4, r0 - asrs r4, r4, #4 - movs r3, #0x3f - ands r4, r3 - movs r5, #0x32 - ldrsh r0, [r7, r5] - ldrh r1, [r1, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r4, r0 - adds r0, r7, #0 - adds r0, #0x74 - ldrh r0, [r0] - movs r6, #0 - ldrsb r6, [r2, r6] - subs r1, r4, r6 - adds r5, r7, #0 - adds r5, #0x38 - ldrb r2, [r5] - bl SetTile - adds r0, r7, #0 - adds r0, #0x76 - ldrh r0, [r0] - ldrb r2, [r5] - adds r1, r4, #0 - bl SetTile - adds r0, r7, #0 - adds r0, #0x78 - ldrh r0, [r0] - adds r4, r4, r6 - ldrb r2, [r5] - adds r1, r4, #0 - bl SetTile - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080854A0: .4byte gUnk_080B4488 -_080854A4: .4byte gRoomControls - - thumb_func_start sub_080854A8 -sub_080854A8: @ 0x080854A8 - push {r4, lr} - ldr r2, _080854E0 @ =gUnk_081205E0 - ldrb r1, [r0, #0x14] - lsrs r1, r1, #1 - lsls r1, r1, #1 - adds r2, r1, r2 - ldrh r3, [r2] - adds r4, r3, #0 - ldr r2, _080854E4 @ =gUnk_080B4488 - adds r1, r1, r2 - ldr r2, [r0, #0x70] - movs r0, #0 - ldrsb r0, [r1, r0] - lsls r1, r0, #1 - subs r0, r2, r1 - ldrh r0, [r0] - cmp r3, r0 - bne _080854E8 - ldrh r0, [r2] - cmp r3, r0 - bne _080854E8 - adds r0, r1, r2 - ldrh r0, [r0] - cmp r4, r0 - bne _080854E8 - movs r0, #0 - b _080854EA - .align 2, 0 -_080854E0: .4byte gUnk_081205E0 -_080854E4: .4byte gUnk_080B4488 -_080854E8: - movs r0, #1 -_080854EA: - pop {r4, pc} diff --git a/include/entity.h b/include/entity.h index 8a04bc42..fb7f68a3 100644 --- a/include/entity.h +++ b/include/entity.h @@ -168,6 +168,7 @@ extern void GetNextFrame(Entity*); extern u32 LoadExtraSpriteData(Entity*, SpriteLoadData*); extern void SetExtraSpriteFrame(Entity*, u32, u32); extern void SetSpriteSubEntryOffsetData1(Entity*, u32, u32); +extern void SetSpriteSubEntryOffsetData2(Entity*, u32, u32); extern Entity* CreateEnemy(u32 subtype, u32 form); extern Entity* CreateObject(u32 subtype, u32 form, u32 parameter); diff --git a/linker.ld b/linker.ld index 032b66c1..479604b6 100644 --- a/linker.ld +++ b/linker.ld @@ -551,6 +551,7 @@ SECTIONS { asm/brocco.o(.text); asm/sittingPerson.o(.text); asm/pina.o(.text); + src/guard.o(.text); asm/guardWithSpear.o(.text); asm/castleMaid.o(.text); asm/din.o(.text); @@ -676,7 +677,7 @@ SECTIONS { asm/object10.o(.text); asm/object11.o(.text); asm/object12.o(.text); - asm/railtrack.o(.text); + src/railtrack.o(.text); asm/lilypadLarge.o(.text); asm/object15.o(.text); asm/floatingPlatform.o(.text); diff --git a/src/guard.c b/src/guard.c new file mode 100644 index 00000000..765a89dd --- /dev/null +++ b/src/guard.c @@ -0,0 +1,196 @@ +#include "global.h" +#include "entity.h" +#include "link.h" +#include "flags.h" +#include "textbox.h" +#include "room.h" + +typedef struct { + u32 unk; + u32 entityCount; +} struct_03003DB8; + +typedef struct { + u8 filler[8]; + u8 unk; +} struct_030010A0; + +typedef struct { + u32 unk; + u32 unk2; +} struct_08064050; + +extern void sub_08063D24(Entity*); +extern void sub_0806ED78(Entity*); +extern u32 GetFacingDirection(Entity*, Entity*); +extern u32 sub_0806F5A4(u32); +extern void sub_0806EE20(Entity*); +extern void sub_08064428(Entity*); +extern u32 sub_0805ACC0(Entity*); +extern void sub_0807DDAC(Entity*, u32); +extern void sub_0807DDE4(Entity*); +extern void sub_0807000C(Entity*); + +extern void (*const gUnk_0810F544[])(Entity*); +extern void (*const gUnk_0810F550[])(Entity*); + +// entity count +extern u8 gUnk_03003DBC; +extern SpriteLoadData gUnk_0810F524[]; +extern void* gUnk_0810F6BC[]; +extern struct_030010A0 gUnk_030010A0; + +void Guard(Entity *this) +{ + if ((this->flags & 2) != 0) { + gUnk_0810F544[this->action](this); + } + else { + sub_08063D24(this); + } +} + +void sub_08063D24(Entity *this) +{ + gUnk_0810F550[this->action](this); + sub_0806ED78(this); +} + +NAKED +void sub_08063D44(Entity* this) { + asm(".include \"asm/non_matching/guard/sub_08063D44.inc\""); +} + +void sub_08063DC8(Entity *this) +{ + if ((this->entityType).form == 0xff) { + this->action = 2; + this->actionDelay = 0x1e; + this->animationState = sub_0806F5A4(GetFacingDirection(this,&gLinkEntity)); + InitAnimationForceUpdate(this, this->animationState + 4); + } + else { + sub_0806EE20(this); + if (this->field_0x3e != this->animationState) { + this->animationState = this->field_0x3e; + InitializeAnimation(this, this->animationState + 4); + } + else { + GetNextFrame(this); + } + if (this->interactType != 0) { + this->action = 3; + this->interactType = 0; + InitializeAnimation(this, sub_0806F5A4(GetFacingDirection(this,&gLinkEntity))); + sub_08064428(this); + } + } +} + +void sub_08063E54(Entity *this) +{ + if (--this->actionDelay == 0) { + SetRoomFlag(0xf); + } +} + +void sub_08063E6C(Entity *this) +{ + if ((gTextBox.doTextBox & 0x7f) == 0) { + this->action = 1; + InitializeAnimation(this, this->animationState + 4); + } +} + +NAKED +void sub_08063E90(Entity* this) { + asm(".include \"asm/non_matching/guard/sub_08063E90.inc\""); +} + +void sub_08063F20(Entity *this) +{ + sub_0807DDAC(this, 0); + sub_0807DDE4(this); + GetNextFrame(this); + if (this->interactType != 0) { + this->action++; + this->interactType = 0; + InitializeAnimation(this, sub_0806F5A4(GetFacingDirection(this, &gLinkEntity)) + *(s8 *)&this->field_0x70); + sub_08064428(this); + } +} + +void sub_08063F78(Entity *this) +{ + if ((gTextBox.doTextBox & 0x7f) == 0) { + this->action = this->action - 1; + InitializeAnimation(this,(this->animationState >> 1) + 4 + *(s8 *)&this->field_0x70); + } +} + +void Guard_Head(Entity *this) +{ + u8 bVar1; + u32 uVar2; + u32 pbVar3; + u32 uVar4; + u32 pbVar5; + + uVar2 = this->frames.all & 0x3f; + pbVar5 = (this->frameIndex & 0x3f); + uVar4 = this->frameSpriteSettings & 0x3f; + if ((this->entityType).subtype == 0x15) { + if ((this->frameIndex & 0x40) != 0) { + pbVar5 = pbVar5 + 0x21; + pbVar3 = 0xffffffff; + uVar4 = 0; + } + else { + pbVar3 = (uVar2 + 0x19); + if ((this->frameSpriteSettings & 0x3f) != 0) { + uVar4 += 0x1f; + } + } + } + else { + pbVar3 = (uVar2 + 0x46); + pbVar5 = pbVar5 + 0x2d; + if ((this->frameSpriteSettings & 0x3f) != 0) { + uVar4 += 0x4c; + } + } + uVar4--; + SetExtraSpriteFrame(this, 0, pbVar3); + SetExtraSpriteFrame(this, 1, pbVar5); + SetExtraSpriteFrame(this, 2, uVar4); + SetSpriteSubEntryOffsetData1(this, 1, 0); + SetSpriteSubEntryOffsetData2(this, 1, 2); + sub_0807000C(this); +} + +void sub_08064030(Entity *arg0,Entity *arg1) +{ + *(u32*)&arg1->animationState = (-gRoomVars.greatFairyState | gRoomVars.greatFairyState) >> 0x1f; +} + +void sub_08064044(void) +{ + gUnk_030010A0.unk = 1; +} + +void sub_08064050(Entity *arg0, struct_08064050 *arg1) +{ + u32 unk; + + arg1->unk2 = 0; + switch (arg0->entityType.parameter) { + case 0x11: + arg1->unk2 = 1; + break; + case 0x12: + arg1->unk2 = 2; + break; + case 0x13: + arg1->unk2 = 3; + } +} \ No newline at end of file diff --git a/src/railtrack.c b/src/railtrack.c new file mode 100644 index 00000000..3d18f068 --- /dev/null +++ b/src/railtrack.c @@ -0,0 +1,148 @@ +#include "global.h" +#include "entity.h" +#include "room.h" +#include "flags.h" + +extern u32* GetLayerByIndex(u32); +extern void sub_08085394(Entity*); +extern void sub_0808543C(Entity*); +extern void sub_08004488(u32); +extern u32 sub_080854A8(Entity*); +extern void SetTile(u32, u32, u32); + +extern void (*const gUnk_081205D0[])(Entity*); + +extern u16 gUnk_081205E0[]; +extern s8 gUnk_080B4488[]; + +void Railtrack(Entity* this) { + gUnk_081205D0[this->action](this); +} + +void sub_080851AC(Entity* this) { + u32 uVar1; + + this->action = 1; + this->spriteSettings.b.draw = 1; + this->spritePriority.b0 = 7; + if ((this->entityType.parameter & 1) != 0) { + this->field_0x7c.HALF.LO = -1; + } else { + this->field_0x7c.HALF.LO = 1; + } + this->animationState = this->entityType.parameter & 2; + if ((this->entityType).form == 3) { + uVar1 = CheckFlags(this->field_0x86); + this->field_0x7a = uVar1; + if ((u16)(uVar1 & -1) != 0) { + this->animationState = (this->animationState + 2) & 3; + this->action = 3; + } + } + InitializeAnimation(this, this->animationState); + this->field_0x70 = (u32)GetLayerByIndex(this->collisionLayer) + 4 + (COORD_TO_TILE(this) * 2); + sub_08085394(this); +} + +void sub_08085264(Entity* this) { + if (CheckFlags(this->field_0x86)) { + this->action = 2; + this->field_0xf = 8; + if (this->entityType.form == 1) { + ClearFlag(this->field_0x86); + } + this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3; + InitializeAnimation(this, this->animationState); + sub_0808543C(this); + sub_08004488(0x151); + } +} + +void sub_080852B4(Entity* this) { + if (--this->field_0xf == 0) { + this->action = 3; + this->field_0xf = this->actionDelay; + this->field_0x7a = CheckFlags(this->field_0x86); + this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3; + InitializeAnimation(this, this->animationState); + sub_08085394(this); + sub_08004488(0x151); + } +} + +void sub_08085308(Entity* this) { + if (sub_080854A8(this) == 0) { + switch (this->entityType.form) { + case 0: + case 1: + break; + case 2: + if (CheckFlags(this->field_0x86) == 0) { + this->action = 1; + return; + } + break; + case 3: + if (CheckFlags(this->field_0x86) == *(u16*)&this->field_0x7a) { + this->field_0xf = 0xff; + } else { + this->field_0xf = 1; + } + } + + if (--this->field_0xf == 0) { + this->action = 2; + this->field_0xf = 8; + this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3; + InitializeAnimation(this, this->animationState); + sub_0808543C(this); + sub_08004488(0x151); + } + } +} + +#if 0 +void sub_08085394(Entity *this) +{ + u32 uVar1; + u16 *layerData; + u32 iVar3; + u32 uVar4; + u8 *pbVar5; + + uVar1 = gUnk_081205E0[this->animationState / 2]; + iVar3 = this->animationState / 2; + layerData = *(u16 **)&this->field_0x70; + uVar4 = COORD_TO_TILE(this); + this->field_0x74 = layerData[gUnk_080B4488[iVar3]]; + pbVar5 = &this->collisionLayer; + SetTile(uVar1, uVar4 - iVar3, *pbVar5); + this->field_0x76 = layerData[0]; + SetTile(uVar1,uVar4, *pbVar5); + *(u16 *)&this->field_0x78 = layerData[iVar3]; + SetTile(uVar1,uVar4 + iVar3, *pbVar5); +} +#endif + +NAKED +void sub_08085394(Entity* this) { + asm(".include \"asm/non_matching/railtrack/sub_08085394.inc\""); +} + +void sub_0808543C(Entity *this) +{ + s8 *cVar1; + u32 uVar2; + s8 temp; + + temp = gUnk_080B4488[(this->animationState >> 1) << 1]; + uVar2 = COORD_TO_TILE(this); + SetTile(this->field_0x74, uVar2 - temp, this->collisionLayer); + SetTile(this->field_0x76, uVar2, this->collisionLayer); + SetTile(this->field_0x78.HWORD, uVar2 + temp, this->collisionLayer); +} + +NAKED +u32 sub_080854A8(Entity *this) { + asm(".include \"asm/non_matching/railtrack/sub_080854A8.inc\""); +} \ No newline at end of file