diff --git a/asm/non_matching/postman/sub_0806076C.inc b/asm/non_matching/postman/sub_0806076C.inc deleted file mode 100644 index d82f1b9f..00000000 --- a/asm/non_matching/postman/sub_0806076C.inc +++ /dev/null @@ -1,186 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #8 - adds r7, r0, #0 - mov sb, r1 - ldr r0, [r7, #0x34] - cmp r0, #0 - bge _08060790 - ldr r1, _0806078C @ =gActiveScriptInfo - movs r0, #0 - strb r0, [r1, #6] - b _080608D8 - .align 2, 0 -_0806078C: .4byte gActiveScriptInfo -_08060790: - adds r4, r7, #0 - adds r4, #0x69 - ldrb r0, [r4] - adds r0, #1 - strb r0, [r4] - adds r5, r7, #0 - adds r5, #0x38 - movs r0, #1 - strb r0, [r5] - adds r0, r7, #0 - bl sub_080606C0 - ldr r1, _080607DC @ =gUnk_0810A918 - adds r2, r7, #0 - adds r2, #0x68 - movs r0, #0 - ldrsb r0, [r2, r0] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r6, [r0] - movs r0, #0 - ldrsb r0, [r4, r0] - adds r6, r6, r0 - mov sl, r4 - mov r8, r2 -_080607C2: - ldrb r0, [r6] - adds r0, #5 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #5 - bls _080607D0 - b _080608D8 -_080607D0: - lsls r0, r0, #2 - ldr r1, _080607E0 @ =_080607E4 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080607DC: .4byte gUnk_0810A918 -_080607E0: .4byte _080607E4 -_080607E4: @ jump table - .4byte _08060846 @ case 0 - .4byte _08060836 @ case 1 - .4byte _08060830 @ case 2 - .4byte _0806082A @ case 3 - .4byte _0806081E @ case 4 - .4byte _080607FC @ case 5 -_080607FC: - adds r6, #1 - movs r5, #0 - ldrsb r5, [r6, r5] - adds r6, #1 - bl Random - adds r1, r5, #0 - bl __modsi3 - adds r0, r6, r0 - ldrb r0, [r0] - movs r1, #0 - mov r2, r8 - strb r0, [r2] - mov r3, sl - strb r1, [r3] - b _080608D8 -_0806081E: - adds r1, r7, #0 - adds r1, #0x6a - movs r0, #0x96 - lsls r0, r0, #1 - strh r0, [r1] - b _080608CC -_0806082A: - movs r0, #1 - strb r0, [r5] - b _080608CC -_08060830: - movs r0, #2 - strb r0, [r5] - b _080608CC -_08060836: - movs r0, #0x1e - mov r4, sb - strh r0, [r4, #0x10] - ldrb r1, [r7, #0x18] - subs r0, #0x22 - ands r0, r1 - strb r0, [r7, #0x18] - b _080608CC -_08060846: - adds r6, #1 - movs r5, #0 - ldrsb r5, [r6, r5] - adds r6, #1 - bl Random - adds r1, r5, #0 - bl __modsi3 - str r0, [sp, #4] - movs r2, #0 - cmp r2, r5 - bhs _080608B8 - ldr r0, _080608C0 @ =gRoomControls - mov sb, r0 -_08060864: - ldr r1, [sp, #4] - adds r0, r6, r1 - ldrb r0, [r0] - mov r3, r8 - strb r0, [r3] - movs r0, #0 - ldrsb r0, [r3, r0] - lsls r0, r0, #2 - ldr r4, _080608C4 @ =gUnk_0810A918 - adds r0, r0, r4 - ldr r0, [r0] - movs r1, #0 - ldrsb r1, [r0, r1] - lsls r1, r1, #2 - ldr r0, _080608C8 @ =gUnk_0810A66C - adds r1, r1, r0 - ldrh r0, [r1] - mov r3, sb - ldrh r3, [r3, #6] - adds r0, r0, r3 - strh r0, [r7, #0x2e] - ldrh r0, [r1, #2] - mov r4, sb - ldrh r4, [r4, #8] - adds r0, r0, r4 - strh r0, [r7, #0x32] - adds r0, r7, #0 - str r2, [sp] - bl CheckOnScreen - cmp r0, #0 - beq _080608B8 - ldr r0, [sp, #4] - adds r0, #1 - adds r1, r5, #0 - bl __modsi3 - str r0, [sp, #4] - ldr r2, [sp] - adds r2, #1 - cmp r2, r5 - blo _08060864 -_080608B8: - movs r0, #0 - mov r1, sl - strb r0, [r1] - b _080608D8 - .align 2, 0 -_080608C0: .4byte gRoomControls -_080608C4: .4byte gUnk_0810A918 -_080608C8: .4byte gUnk_0810A66C -_080608CC: - mov r2, sl - ldrb r0, [r2] - adds r0, #1 - strb r0, [r2] - adds r6, #1 - b _080607C2 -_080608D8: - add sp, #8 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/asm/non_matching/postman/sub_080608E4.inc b/asm/non_matching/postman/sub_080608E4.inc deleted file mode 100644 index 52c2bf03..00000000 --- a/asm/non_matching/postman/sub_080608E4.inc +++ /dev/null @@ -1,79 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r5, r1, #0 - movs r0, #0 - str r0, [r5, #0x14] - ldr r0, [r4, #0x34] - cmp r0, #0 - blt _08060970 - adds r0, r4, #0 - adds r0, #0x38 - ldrb r1, [r0] - ldr r6, _08060974 @ =gPlayerEntity - cmp r1, #1 - bne _0806090A - adds r0, r6, #0 - adds r0, #0x38 - ldrb r0, [r0] - cmp r0, #2 - beq _08060970 -_0806090A: - cmp r1, #2 - bne _08060918 - adds r0, r6, #0 - adds r0, #0x38 - ldrb r0, [r0] - cmp r0, #1 - beq _08060970 -_08060918: - ldr r2, [r5, #4] - lsls r2, r2, #4 - ldrb r0, [r4, #0x14] - lsrs r0, r0, #1 - lsls r0, r0, #2 - ldr r1, _08060978 @ =gUnk_0810AA70 - adds r0, r0, r1 - adds r2, r2, r0 - movs r0, #0x2e - ldrsh r1, [r4, r0] - movs r0, #0 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - movs r7, #0x32 - ldrsh r3, [r4, r7] - movs r0, #1 - ldrsb r0, [r2, r0] - adds r3, r3, r0 - movs r7, #0x2e - ldrsh r0, [r6, r7] - subs r1, r0, r1 - movs r7, #0x32 - ldrsh r0, [r6, r7] - subs r3, r0, r3 - movs r0, #2 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - ldrb r2, [r2, #3] - lsls r2, r2, #0x18 - asrs r2, r2, #0x18 - adds r3, r3, r2 - lsls r0, r0, #1 - cmp r0, r1 - bls _08060970 - lsls r0, r2, #1 - cmp r0, r3 - bls _08060970 - movs r0, #1 - str r0, [r5, #0x14] - adds r1, r4, #0 - adds r1, #0x6a - ldrh r0, [r1] - adds r0, #2 - strh r0, [r1] -_08060970: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08060974: .4byte gPlayerEntity -_08060978: .4byte gUnk_0810AA70 - .syntax divided diff --git a/src/npc/postman.c b/src/npc/postman.c index 37c773ef..dd1f2381 100644 --- a/src/npc/postman.c +++ b/src/npc/postman.c @@ -9,7 +9,7 @@ extern void sub_080604DC(Entity*); extern void sub_080606D8(Entity*); extern void sub_080606C0(Entity*); -extern const s8 gUnk_0810AA70[]; +extern const s8 gUnk_0810AA70[][4][4]; typedef struct { s16 x; @@ -194,25 +194,32 @@ void sub_0806075C(Entity* this) { this->field_0x68.HALF.HI = 0xff; } -NONMATCH("asm/non_matching/postman/sub_0806076C.inc", - void sub_0806076C(Entity* this, ScriptExecutionContext* context)) { - s8* p; - u32 tmp, size; - int i; +void sub_0806076C(Entity* this, ScriptExecutionContext* context) { + s32 cVar2; + int iVar4; + u32 uVar6; + s32 uVar9; + int local_24; + Coords16* ptr; + s8* pbVar10; if (this->z.WORD < 0) { gActiveScriptInfo.commandSize = 0; return; } - this->field_0x68.HALF.HI++; this->collisionLayer = 1; sub_080606C0(this); - p = &gUnk_0810A918[this->field_0x68.HALF.LO][this->field_0x68.HALF.HI]; + pbVar10 = gUnk_0810A918[(s8)this->field_0x68.HALF.LO]; + pbVar10 += (s8)this->field_0x68.HALF.HI; do { - switch (p[0] + 5) { + switch ((s8)(pbVar10[0] + 5)) { case 5: - this->field_0x68.HALF.LO = p[(s32)Random() % p[1] + 2]; + pbVar10++; + uVar9 = pbVar10[0]; + pbVar10++; + iVar4 = (s32)Random() % uVar9; + this->field_0x68.HALF.LO = pbVar10[iVar4]; this->field_0x68.HALF.HI = 0; return; case 4: @@ -225,50 +232,53 @@ NONMATCH("asm/non_matching/postman/sub_0806076C.inc", this->collisionLayer = 2; break; case 1: - context->wait = 30; + context->wait = 0x1e; this->spriteSettings.draw = 0; break; case 0: - size = p[1]; - tmp = Random() % size; - for (i = 0; i < size; ++i) { - this->field_0x68.HALF.HI = p[i + 2]; - this->x.HALF.HI = - gUnk_0810A66C[gUnk_0810A918[this->field_0x68.HALF.LO][0]].x + gRoomControls.origin_x; - this->y.HALF.HI = - gUnk_0810A66C[gUnk_0810A918[this->field_0x68.HALF.LO][0]].y + gRoomControls.origin_y; - if (!CheckOnScreen(this)) { + pbVar10++; + uVar9 = *pbVar10++; + local_24 = ((s32)Random()) % uVar9; + + for (uVar6 = 0; uVar6 < uVar9; uVar6++) { + this->field_0x68.HALF.LO = pbVar10[local_24]; + cVar2 = gUnk_0810A918[(s8)this->field_0x68.HALF.LO][0]; + ptr = &gUnk_0810A66C[cVar2]; + this->x.HALF_U.HI = gRoomControls.origin_x + ptr->x; + this->y.HALF_U.HI = gRoomControls.origin_y + ptr->y; + if (CheckOnScreen(this) == 0) break; - } - tmp = (tmp + 1) % size; + local_24 = (s32)(local_24 + 1) % uVar9; } - this->field_0x68.HALF.LO = 0; + this->field_0x68.HALF.HI = 0; return; default: return; } - this->field_0x68.HALF.LO++; - p++; - } while (1); + this->field_0x68.HALF.HI++; + pbVar10++; + } while (TRUE); } -END_NONMATCH -NONMATCH("asm/non_matching/postman/sub_080608E4.inc", - void sub_080608E4(Entity* this, ScriptExecutionContext* context)) { +void sub_080608E4(Entity* this, ScriptExecutionContext* context) { context->condition = 0; if (this->z.WORD >= 0) { if ((this->collisionLayer != 1 || gPlayerEntity.collisionLayer != 2) && (this->collisionLayer != 2 || gPlayerEntity.collisionLayer != 1)) { - const s8* ptr = &gUnk_0810AA70[context->intVariable * 16 + (this->animationState >> 1) * 4]; - if (ptr[0] + gPlayerEntity.x.HALF.HI + ptr[2] - this->x.HALF.HI < ptr[2] * 2 && - ptr[1] + gPlayerEntity.y.HALF.HI + ptr[3] - this->y.HALF.HI < ptr[3] * 2) { + const s8* ptr = gUnk_0810AA70[context->intVariable][this->animationState >> 1]; + u32 x = this->x.HALF.HI + ptr[0]; + u32 y = this->y.HALF.HI + ptr[1]; + x = gPlayerEntity.x.HALF.HI - x; + y = gPlayerEntity.y.HALF.HI - y; + x += ptr[2]; + y += ptr[3]; + if (ptr[2] * 2 > x && ptr[3] * 2 > y) { context->condition = 1; this->field_0x6a.HWORD += 2; } } } } -END_NONMATCH void Postman_Fusion(Entity* this) { if (this->action == 0) {