diff --git a/Makefile b/Makefile index 8159581a..0735bd2a 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ endif #$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork -C_SRCS := $(wildcard $(C_SUBDIR)/*.c) +C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s) diff --git a/asm/non_matching/postman/sub_08060700.inc b/asm/non_matching/postman/sub_08060700.inc new file mode 100644 index 00000000..326e221b --- /dev/null +++ b/asm/non_matching/postman/sub_08060700.inc @@ -0,0 +1,51 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, r5, lr} + ldr r3, _0806074C @ =gUnk_0810A918 + adds r2, r0, #0 + adds r2, #0x68 + ldrb r2, [r2] + lsls r2, r2, #0x18 + asrs r2, r2, #0x18 + lsls r2, r2, #2 + adds r2, r2, r3 + ldr r2, [r2] + adds r3, r0, #0 + adds r3, #0x69 + ldrb r3, [r3] + lsls r3, r3, #0x18 + asrs r3, r3, #0x18 + adds r2, r2, r3 + movs r3, #0 + ldrsb r3, [r2, r3] + lsls r3, r3, #2 + ldr r2, _08060750 @ =gUnk_0810A66C + adds r3, r3, r2 + ldr r4, _08060754 @ =gRoomControls + movs r5, #0 + ldrsh r2, [r3, r5] + ldrh r5, [r4, #6] + adds r2, r2, r5 + movs r5, #2 + ldrsh r3, [r3, r5] + ldrh r4, [r4, #8] + adds r3, r3, r4 + bl sub_0807DEDC + ldr r2, _08060758 @ =gUnk_02033280 + ldrb r1, [r2, #7] + movs r0, #1 + orrs r0, r1 + strb r0, [r2, #7] + pop {r4, r5, pc} + .align 2, 0 +_0806074C: .4byte gUnk_0810A918 +_08060750: .4byte gUnk_0810A66C +_08060754: .4byte gRoomControls +_08060758: .4byte gUnk_02033280 + .syntax divided \ No newline at end of file diff --git a/asm/postman.s b/asm/postman.s index 66761797..3bb384b7 100644 --- a/asm/postman.s +++ b/asm/postman.s @@ -6,453 +6,6 @@ .text - - thumb_func_start Postman -Postman: @ 0x080603FC - push {lr} - adds r2, r0, #0 - ldrb r1, [r2, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08060412 - adds r0, r2, #0 - bl sub_08060528 - b _08060422 -_08060412: - ldr r0, _08060424 @ =gUnk_0810AA24 - ldrb r1, [r2, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r2, #0 - bl _call_via_r1 -_08060422: - pop {pc} - .align 2, 0 -_08060424: .4byte gUnk_0810AA24 - - thumb_func_start sub_08060428 -sub_08060428: @ 0x08060428 - push {r4, lr} - adds r4, r0, #0 - movs r0, #0x5a - strb r0, [r4, #0xe] - movs r0, #0xc0 - lsls r0, r0, #1 - strh r0, [r4, #0x24] - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _08060444 - bl GetCurrentRoomProperty - adds r1, r0, #0 - b _08060446 -_08060444: - movs r1, #0 -_08060446: - adds r0, r4, #0 - movs r2, #0 - bl sub_0806EE04 - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #4 - bl InitAnimationForceUpdate - pop {r4, pc} - - thumb_func_start sub_0806045C -sub_0806045C: @ 0x0806045C - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl sub_080604DC - adds r0, r4, #0 - adds r0, #0x39 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #2 - bgt _08060488 - cmp r0, #1 - blt _08060488 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0 - bl TextboxNoOverlapFollow - b _080604C0 -_08060488: - adds r0, r4, #0 - adds r0, #0x3e - ldrb r1, [r0] - ldrb r0, [r4, #0x14] - cmp r1, r0 - beq _0806049E - strb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitAnimationForceUpdate -_0806049E: - adds r0, r4, #0 - movs r1, #0x18 - movs r2, #0x18 - bl sub_0806ED9C - movs r1, #0 - cmp r0, #0 - blt _080604B6 - ldrb r2, [r4, #0x14] - cmp r0, r2 - bne _080604B6 - movs r1, #1 -_080604B6: - cmp r1, #0 - bne _080604C0 - adds r0, r4, #0 - bl sub_0806EE20 -_080604C0: - adds r0, r4, #0 - bl sub_0806ED78 - pop {r4, pc} - - thumb_func_start sub_080604C8 -sub_080604C8: @ 0x080604C8 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl sub_080604DC - movs r0, #1 - strb r0, [r4, #0xc] - pop {r4, pc} - - thumb_func_start sub_080604DC -sub_080604DC: @ 0x080604DC - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0x18] - lsls r0, r0, #0x1e - lsrs r4, r0, #0x1e - cmp r4, #1 - bne _08060524 - adds r0, r5, #0 - bl sub_080040A8 - cmp r0, #0 - beq _08060524 - adds r2, r5, #0 - adds r2, #0x5a - ldrb r1, [r2] - ands r4, r1 - cmp r4, #0 - beq _08060524 - movs r0, #0xfe - ands r0, r1 - strb r0, [r2] - adds r0, r5, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _08060524 - ldrh r0, [r1, #0x32] - adds r0, #1 - strh r0, [r1, #0x32] - adds r0, r1, #0 - movs r1, #3 - bl sub_0805E3A0 -_08060524: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08060528 -sub_08060528: @ 0x08060528 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r3, [r4, #0xc] - cmp r3, #1 - beq _08060582 - cmp r3, #1 - bgt _0806053C - cmp r3, #0 - beq _08060546 - b _080605EC -_0806053C: - cmp r3, #2 - beq _080605F6 - cmp r3, #3 - beq _08060618 - b _080605EC -_08060546: - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x68 - strb r3, [r0] - adds r0, #1 - strb r3, [r0] - adds r5, r4, #0 - adds r5, #0x6a - movs r0, #0 - strh r3, [r5] - adds r6, r4, #0 - adds r6, #0x6d - strb r0, [r6] - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x6c - strb r0, [r1] - adds r0, r4, #0 - bl sub_0807DD50 - b _08060634 -_08060582: - adds r2, r4, #0 - adds r2, #0x39 - movs r0, #0 - ldrsb r0, [r2, r0] - cmp r0, #2 - bne _080605B8 - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r2] - adds r0, r4, #0 - bl sub_0806F118 - ldr r1, _080605B4 @ =gLinkEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _080605EC - .align 2, 0 -_080605B4: .4byte gLinkEntity -_080605B8: - cmp r0, #0 - beq _080605E4 - movs r1, #0 - movs r0, #2 - strb r0, [r4, #0xc] - strb r1, [r2] - adds r0, r4, #0 - bl sub_080606D8 - ldr r1, _080605E0 @ =gLinkEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _080605EC - .align 2, 0 -_080605E0: .4byte gLinkEntity -_080605E4: - adds r0, r4, #0 - movs r1, #0 - bl sub_0807DD94 -_080605EC: - adds r5, r4, #0 - adds r5, #0x6a - adds r6, r4, #0 - adds r6, #0x6d - b _08060634 -_080605F6: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - ldr r0, _08060614 @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - adds r5, r4, #0 - adds r5, #0x6a - adds r6, r4, #0 - adds r6, #0x6d - cmp r0, #0 - bne _08060634 - b _08060630 - .align 2, 0 -_08060614: .4byte gTextBox -_08060618: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl UpdateFuseInteraction - adds r5, r4, #0 - adds r5, #0x6a - adds r6, r4, #0 - adds r6, #0x6d - cmp r0, #0 - beq _08060634 -_08060630: - movs r0, #1 - strb r0, [r4, #0xc] -_08060634: - adds r0, r4, #0 - bl sub_080604DC - adds r1, r5, #0 - ldrh r3, [r1] - movs r0, #0 - ldrsh r2, [r1, r0] - cmp r2, #0 - ble _08060670 - ldr r0, _08060668 @ =0x0000012B - cmp r2, r0 - ble _0806066C - movs r0, #0 - strh r0, [r1] - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - movs r0, #1 - strb r0, [r6] - adds r0, r4, #0 - bl sub_080788E0 - movs r0, #0x7c - bl sub_08004488 - b _08060670 - .align 2, 0 -_08060668: .4byte 0x0000012B -_0806066C: - subs r0, r3, #1 - strh r0, [r5] -_08060670: - movs r1, #0xc0 - lsls r1, r1, #5 - adds r0, r4, #0 - bl sub_08003FC4 - ldrb r0, [r6] - cmp r0, #0 - beq _08060694 - ldr r0, [r4, #0x20] - cmp r0, #0 - bne _08060694 - ldr r0, [r4, #0x34] - cmp r0, #0 - bne _08060694 - strb r0, [r6] - adds r0, r4, #0 - bl sub_080606C0 -_08060694: - ldr r0, [r4, #0x34] - cmp r0, #0 - blt _080606B4 - ldr r0, _080606BC @ =gLinkEntity - adds r0, #0x38 - ldrb r1, [r0] - cmp r1, #0 - beq _080606AE - adds r0, r4, #0 - adds r0, #0x38 - ldrb r0, [r0] - cmp r0, r1 - bne _080606B4 -_080606AE: - adds r0, r4, #0 - bl sub_0806ED78 -_080606B4: - adds r0, r4, #0 - bl sub_0800451C - pop {r4, r5, r6, pc} - .align 2, 0 -_080606BC: .4byte gLinkEntity - - thumb_func_start sub_080606C0 -sub_080606C0: @ 0x080606C0 - push {r4, lr} - adds r4, r0, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x6c - strb r0, [r1] - ldrb r1, [r1] - adds r0, r4, #0 - bl sub_08078784 - pop {r4, pc} - - thumb_func_start sub_080606D8 -sub_080606D8: @ 0x080606D8 - push {lr} - adds r2, r0, #0 - ldr r0, _080606F8 @ =gUnk_02002A40 - ldrb r0, [r0, #8] - subs r0, #2 - cmp r0, #0 - bge _080606E8 - movs r0, #0 -_080606E8: - lsls r1, r0, #3 - ldr r0, _080606FC @ =gUnk_0810AA30 - adds r1, r1, r0 - adds r0, r2, #0 - bl ShowNPCDialogue - pop {pc} - .align 2, 0 -_080606F8: .4byte gUnk_02002A40 -_080606FC: .4byte gUnk_0810AA30 - - thumb_func_start sub_08060700 -sub_08060700: @ 0x08060700 - push {r4, r5, lr} - ldr r3, _0806074C @ =gUnk_0810A918 - adds r2, r0, #0 - adds r2, #0x68 - ldrb r2, [r2] - lsls r2, r2, #0x18 - asrs r2, r2, #0x18 - lsls r2, r2, #2 - adds r2, r2, r3 - ldr r2, [r2] - adds r3, r0, #0 - adds r3, #0x69 - ldrb r3, [r3] - lsls r3, r3, #0x18 - asrs r3, r3, #0x18 - adds r2, r2, r3 - movs r3, #0 - ldrsb r3, [r2, r3] - lsls r3, r3, #2 - ldr r2, _08060750 @ =gUnk_0810A66C - adds r3, r3, r2 - ldr r4, _08060754 @ =gRoomControls - movs r5, #0 - ldrsh r2, [r3, r5] - ldrh r5, [r4, #6] - adds r2, r2, r5 - movs r5, #2 - ldrsh r3, [r3, r5] - ldrh r4, [r4, #8] - adds r3, r3, r4 - bl sub_0807DEDC - ldr r2, _08060758 @ =gUnk_02033280 - ldrb r1, [r2, #7] - movs r0, #1 - orrs r0, r1 - strb r0, [r2, #7] - pop {r4, r5, pc} - .align 2, 0 -_0806074C: .4byte gUnk_0810A918 -_08060750: .4byte gUnk_0810A66C -_08060754: .4byte gRoomControls -_08060758: .4byte gUnk_02033280 - - thumb_func_start sub_0806075C -sub_0806075C: @ 0x0806075C - adds r2, r0, #0 - adds r2, #0x68 - movs r1, #0xb - strb r1, [r2] - adds r0, #0x69 - movs r1, #0xff - strb r1, [r0] - bx lr - thumb_func_start sub_0806076C sub_0806076C: @ 0x0806076C push {r4, r5, r6, r7, lr} diff --git a/linker.ld b/linker.ld index 1ad87c17..cca61b62 100644 --- a/linker.ld +++ b/linker.ld @@ -537,6 +537,7 @@ SECTIONS { src/festari.o(.text); asm/festari.o(.text); src/forestMinish.o(.text); + src/postman.o(.text); asm/postman.o(.text); asm/npc5.o(.text); asm/townsperson.o(.text); diff --git a/src/postman.c b/src/postman.c new file mode 100644 index 00000000..b3a51dba --- /dev/null +++ b/src/postman.c @@ -0,0 +1,227 @@ +#include "global.h" +#include "entity.h" +#include "npc.h" +#include "textbox.h" +#include "link.h" + +typedef struct { + u8 filler[7]; + u8 unk; +} struct_02033280; + +extern void sub_08060528(Entity*); +extern void* GetCurrentRoomProperty(u32); +extern void sub_0806EE04(Entity*, void*, u32); +extern void sub_080604DC(Entity*); +extern s32 sub_0806ED9C(Entity*, u32, u32); +extern void sub_0806EE20(Entity*); +extern void sub_0806ED78(Entity*); +extern u32 sub_080040A8(Entity*); +extern void sub_0805E3A0(Entity*, u32); +extern u32 sub_0801E99C(Entity*); +extern void sub_0807DD50(Entity*); +extern void sub_0806F118(Entity*); +extern u32 sub_0806F5A4(u32); +extern u32 GetFacingDirection(Entity*, Entity*); +extern void sub_080606D8(Entity*); +extern void sub_0807DD94(Entity*, u32); +extern void sub_080788E0(Entity*); +extern void sub_08004488(u32); +extern void sub_08003FC4(Entity*, u32); +extern void sub_080606C0(Entity*); +extern void sub_0800451C(Entity*); +extern void sub_08078784(Entity*, u32); +extern void sub_0807DEDC(Entity*, u32, u32, u32); + +extern void (*const gUnk_0810AA24[])(Entity*); +extern u32 gUnk_0810AA30[]; +extern u32** gUnk_0810A66C; +extern u32 gUnk_0810A918[]; +extern struct_02033280 gUnk_02033280; + +void Postman(Entity* this) { + if ((this->flags & 2) != 0) { + sub_08060528(this); + } else { + gUnk_0810AA24[this->action](this); + } +} + +void sub_08060428(Entity* this) { + u8 bVar1; + void* data; + + this->actionDelay = 0x5a; + this->nonPlanarMovement = 0x180; + if (this->entityType.parameter != 0) { + data = GetCurrentRoomProperty(this->entityType.parameter); + } else { + data = NULL; + } + sub_0806EE04(this, data, 0); + this->action = 1; + InitAnimationForceUpdate(this, 4); +} + +void sub_0806045C(Entity* this) { + u8 bVar1; + u32 uVar2; + u32 bVar3; + s32 temp; + + UpdateAnimationSingleFrame(this); + sub_080604DC(this); + switch (this->interactType) { + case 1: + case 2: + this->action = 2; + TextboxNoOverlapFollow(0); + break; + default: + bVar1 = this->field_0x3e; + if (bVar1 != this->animationState) { + this->animationState = bVar1; + InitAnimationForceUpdate(this, 4 + bVar1); + } + temp = sub_0806ED9C(this, 0x18, 0x18); + if ((temp > -1) && (temp == this->animationState)) { + bVar3 = 1; + } else { + bVar3 = 0; + } + if (!bVar3) { + sub_0806EE20(this); + } + } + sub_0806ED78(this); +} + +void sub_080604C8(Entity* this) { + UpdateAnimationSingleFrame(this); + sub_080604DC(this); + this->action = 1; +} + +void sub_080604DC(Entity* this) { + u8 bVar1; + int iVar2; + Entity* ent; + + if (((u32)(this->spriteSettings.raw << 0x1e) >> 0x1e == 1) && sub_080040A8(this)) { + if ((this->frames.all & 1) != 0) { + this->frames.all &= 0xfe; + ent = CreateFx(this, 0x11, 0x40); + if (ent != NULL) { + ent->y.HALF.HI++; + sub_0805E3A0(ent, 3); + } + } + } +} + +void sub_08060528(Entity *this) +{ + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.b.draw = TRUE; + this->field_0x68 = 0; + this->field_0x69 = 0; + this->field_0x6a.HWORD = 0; + this->field_0x6d = 0; + this->field_0x6c = sub_0801E99C(this); + sub_0807DD50(this); + break; + case 1: + if (this->interactType == 2) { + this->action = 3; + this->interactType = 0; + sub_0806F118(this); + InitAnimationForceUpdate(this, sub_0806F5A4(GetFacingDirection(this, &gLinkEntity))); + } + else { + if (this->interactType != 0) { + this->action = 2; + this->interactType = 0; + sub_080606D8(this); + InitAnimationForceUpdate(this, sub_0806F5A4(GetFacingDirection(this, &gLinkEntity))); + } + else { + sub_0807DD94(this, 0); + } + } + break; + case 2: + UpdateAnimationSingleFrame(this); + if ((gTextBox.doTextBox & 0x7f) != 0) { + break; + } + this->action = 1; + break; + case 3: + UpdateAnimationSingleFrame(this); + if (!UpdateFuseInteraction(this)) { + break; + } + this->action = 1; + } + sub_080604DC(this); + if (0 < (s16)this->field_0x6a.HWORD) { + if ((s16)this->field_0x6a.HWORD > 0x12b) { + this->field_0x6a.HWORD = 0; + this->field_0x20 = 0x20000; + this->field_0x6d = 1; + sub_080788E0(this); + sub_08004488(0x7c); + } + else { + this->field_0x6a.HWORD -= 1; + } + } + sub_08003FC4(this, 0x1800); + if (((this->field_0x6d != 0) && (this->field_0x20 == 0)) && this->height.WORD == 0) { + this->field_0x6d = 0; + sub_080606C0(this); + } + if ((-1 < this->height.WORD) && + ((gLinkEntity.collisionLayer == 0 || (this->collisionLayer == gLinkEntity.collisionLayer)))) { + sub_0806ED78(this); + } + sub_0800451C(this); +} + +void sub_080606C0(Entity *this) +{ + this->field_0x6c = sub_0801E99C(this); + sub_08078784(this, this->field_0x6c); +} + +void sub_080606D8(Entity* this) +{ + s32 iVar1; + + iVar1 = gUnk_02002A40.unk - 2; + if (iVar1 < 0) { + iVar1 = 0; + } + ShowNPCDialogue(this, &gUnk_0810AA30[iVar1 * 2]); +} + +#if 0 +void sub_08060700(Entity *arg0, u32 arg1) +{ + sub_0807DEDC(arg0,arg1, + gUnk_0810A918[gUnk_0810A66C[arg0->field_0x69][arg0->field_0x68] * 4 + gRoomControls.roomOriginX], + gUnk_0810A918[gUnk_0810A66C[arg0->field_0x69][arg0->field_0x68] * 4 + gRoomControls.roomOriginY + 2]); + gUnk_02033280.unk |= 1; +} +#endif +NAKED void sub_08060700(Entity *arg0, u32 arg1) { + asm(".include \"asm/non_matching/postman/sub_08060700.inc\""); +} + +void sub_0806075C(Entity *this) +{ + this->field_0x68 = 0xb; + this->field_0x69 = 0xff; +} \ No newline at end of file