diff --git a/asm/cow.s b/asm/cow.s index a5610659..39c0a90e 100644 --- a/asm/cow.s +++ b/asm/cow.s @@ -7,210 +7,210 @@ .text - thumb_func_start sub_08068F98 -sub_08068F98: @ 0x08068F98 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08068FBC @ =gUnk_08111914 - 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 - adds r0, r4, #0 - bl sub_0806920C - pop {r4, pc} - .align 2, 0 -_08068FBC: .4byte gUnk_08111914 +@ thumb_func_start sub_08068F98 +@sub_08068F98: @ 0x08068F98 +@ push {r4, lr} +@ adds r4, r0, #0 +@ ldr r1, _08068FBC @ =gUnk_08111914 +@ 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 +@ adds r0, r4, #0 +@ bl sub_0806920C +@ pop {r4, pc} +@ .align 2, 0 +@_08068FBC: .4byte gUnk_08111914 - thumb_func_start sub_08068FC0 -sub_08068FC0: @ 0x08068FC0 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xb] - strb r0, [r4, #0x14] - movs r0, #0x40 - strh r0, [r4, #0x24] - adds r1, r4, #0 - adds r1, #0x6d - movs r0, #0xff - strb r0, [r1] - adds r0, r4, #0 - bl sub_0805ACC0 - adds r2, r0, #0 - cmp r2, #0 - bne _08068FF4 - 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 _08069000 -_08068FF4: - lsrs r1, r2, #0x10 - adds r0, r4, #0 - adds r0, #0x68 - strh r1, [r0] - adds r0, #2 - strh r2, [r0] -_08069000: - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x6c - strb r0, [r1] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl LoadAnimation - pop {r4, pc} +@ thumb_func_start sub_08068FC0 +@sub_08068FC0: @ 0x08068FC0 +@ push {r4, lr} +@ adds r4, r0, #0 +@ movs r0, #1 +@ strb r0, [r4, #0xc] +@ ldrb r0, [r4, #0xb] +@ strb r0, [r4, #0x14] +@ movs r0, #0x40 +@ strh r0, [r4, #0x24] +@ adds r1, r4, #0 +@ adds r1, #0x6d +@ movs r0, #0xff +@ strb r0, [r1] +@ adds r0, r4, #0 +@ bl sub_0805ACC0 +@ adds r2, r0, #0 +@ cmp r2, #0 +@ bne _08068FF4 +@ 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 _08069000 +@_08068FF4: +@ lsrs r1, r2, #0x10 +@ adds r0, r4, #0 +@ adds r0, #0x68 +@ strh r1, [r0] +@ adds r0, #2 +@ strh r2, [r0] +@_08069000: +@ adds r0, r4, #0 +@ bl sub_0801E99C +@ adds r1, r4, #0 +@ adds r1, #0x6c +@ strb r0, [r1] +@ ldrb r1, [r4, #0x14] +@ adds r1, #4 +@ adds r0, r4, #0 +@ bl LoadAnimation +@ pop {r4, pc} - thumb_func_start sub_08069018 -sub_08069018: @ 0x08069018 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _0806903A - adds r0, #1 - strb r0, [r4, #0xd] - bl Random - movs r1, #0x3f - ands r0, r1 - adds r0, #0x3c - strb r0, [r4, #0xf] - ldrb r1, [r4, #0x14] - adds r0, r4, #0 - bl LoadAnimation -_0806903A: - adds r0, r4, #0 - bl sub_080042B8 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #0 - bne _0806905E - ldrb r0, [r4, #0xe] - cmp r0, #0 - bne _08069058 - movs r0, #2 - b _0806905A -_08069058: - movs r0, #3 -_0806905A: - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] -_0806905E: - adds r0, r4, #0 - bl sub_0806924C - pop {r4, pc} - .align 2, 0 +@ thumb_func_start sub_08069018 +@sub_08069018: @ 0x08069018 +@ push {r4, lr} +@ adds r4, r0, #0 +@ ldrb r0, [r4, #0xd] +@ cmp r0, #0 +@ bne _0806903A +@ adds r0, #1 +@ strb r0, [r4, #0xd] +@ bl Random +@ movs r1, #0x3f +@ ands r0, r1 +@ adds r0, #0x3c +@ strb r0, [r4, #0xf] +@ ldrb r1, [r4, #0x14] +@ adds r0, r4, #0 +@ bl LoadAnimation +@_0806903A: +@ adds r0, r4, #0 +@ bl sub_080042B8 +@ ldrb r0, [r4, #0xf] +@ subs r0, #1 +@ strb r0, [r4, #0xf] +@ lsls r0, r0, #0x18 +@ lsrs r1, r0, #0x18 +@ cmp r1, #0 +@ bne _0806905E +@ ldrb r0, [r4, #0xe] +@ cmp r0, #0 +@ bne _08069058 +@ movs r0, #2 +@ b _0806905A +@_08069058: +@ movs r0, #3 +@_0806905A: +@ strb r0, [r4, #0xc] +@ strb r1, [r4, #0xd] +@_0806905E: +@ adds r0, r4, #0 +@ bl sub_0806924C +@ pop {r4, pc} +@ .align 2, 0 - thumb_func_start sub_08069068 -sub_08069068: @ 0x08069068 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _080690A4 - adds r0, #1 - strb r0, [r4, #0xd] - bl Random - movs r1, #2 - ands r1, r0 - subs r1, #1 - ldrb r0, [r4, #0x14] - adds r1, r1, r0 - movs r0, #3 - ands r1, r0 - strb r1, [r4, #0x14] - lsls r1, r1, #3 - strb r1, [r4, #0x15] - bl Random - movs r1, #0x3f - ands r0, r1 - adds r0, #0x3c - strb r0, [r4, #0xf] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl LoadAnimation -_080690A4: - adds r0, r4, #0 - bl sub_080AEF88 - adds r0, r4, #0 - bl sub_080042B8 - movs r0, #0x2e - ldrsh r1, [r4, r0] - adds r2, r4, #0 - adds r2, #0x68 - movs r3, #0 - ldrsh r0, [r2, r3] - subs r1, r1, r0 - cmp r1, #0x10 - ble _080690CC - ldrh r0, [r2] - adds r0, #0x10 - strh r0, [r4, #0x2e] - movs r0, #1 - strb r0, [r4, #0xf] -_080690CC: - movs r3, #0x10 - rsbs r3, r3, #0 - cmp r1, r3 - bge _080690DE - ldrh r0, [r2] - subs r0, #0x10 - strh r0, [r4, #0x2e] - movs r0, #1 - strb r0, [r4, #0xf] -_080690DE: - movs r5, #0x32 - ldrsh r1, [r4, r5] - adds r2, r4, #0 - adds r2, #0x6a - movs r5, #0 - ldrsh r0, [r2, r5] - subs r1, r1, r0 - cmp r1, #0x10 - ble _080690FA - ldrh r0, [r2] - adds r0, #0x10 - strh r0, [r4, #0x32] - movs r0, #1 - strb r0, [r4, #0xf] -_080690FA: - cmp r1, r3 - bge _08069108 - ldrh r0, [r2] - subs r0, #0x10 - strh r0, [r4, #0x32] - movs r0, #1 - strb r0, [r4, #0xf] -_08069108: - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #0 - bne _0806911C - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] -_0806911C: - adds r0, r4, #0 - bl sub_0806924C - pop {r4, r5, pc} +@ thumb_func_start sub_08069068 +@sub_08069068: @ 0x08069068 +@ push {r4, r5, lr} +@ adds r4, r0, #0 +@ ldrb r0, [r4, #0xd] +@ cmp r0, #0 +@ bne _080690A4 +@ adds r0, #1 +@ strb r0, [r4, #0xd] +@ bl Random +@ movs r1, #2 +@ ands r1, r0 +@ subs r1, #1 +@ ldrb r0, [r4, #0x14] +@ adds r1, r1, r0 +@ movs r0, #3 +@ ands r1, r0 +@ strb r1, [r4, #0x14] +@ lsls r1, r1, #3 +@ strb r1, [r4, #0x15] +@ bl Random +@ movs r1, #0x3f +@ ands r0, r1 +@ adds r0, #0x3c +@ strb r0, [r4, #0xf] +@ ldrb r1, [r4, #0x14] +@ adds r1, #4 +@ adds r0, r4, #0 +@ bl LoadAnimation +@_080690A4: +@ adds r0, r4, #0 +@ bl sub_080AEF88 +@ adds r0, r4, #0 +@ bl sub_080042B8 +@ movs r0, #0x2e +@ ldrsh r1, [r4, r0] +@ adds r2, r4, #0 +@ adds r2, #0x68 +@ movs r3, #0 +@ ldrsh r0, [r2, r3] +@ subs r1, r1, r0 +@ cmp r1, #0x10 +@ ble _080690CC +@ ldrh r0, [r2] +@ adds r0, #0x10 +@ strh r0, [r4, #0x2e] +@ movs r0, #1 +@ strb r0, [r4, #0xf] +@_080690CC: +@ movs r3, #0x10 +@ rsbs r3, r3, #0 +@ cmp r1, r3 +@ bge _080690DE +@ ldrh r0, [r2] +@ subs r0, #0x10 +@ strh r0, [r4, #0x2e] +@ movs r0, #1 +@ strb r0, [r4, #0xf] +@_080690DE: +@ movs r5, #0x32 +@ ldrsh r1, [r4, r5] +@ adds r2, r4, #0 +@ adds r2, #0x6a +@ movs r5, #0 +@ ldrsh r0, [r2, r5] +@ subs r1, r1, r0 +@ cmp r1, #0x10 +@ ble _080690FA +@ ldrh r0, [r2] +@ adds r0, #0x10 +@ strh r0, [r4, #0x32] +@ movs r0, #1 +@ strb r0, [r4, #0xf] +@_080690FA: +@ cmp r1, r3 +@ bge _08069108 +@ ldrh r0, [r2] +@ subs r0, #0x10 +@ strh r0, [r4, #0x32] +@ movs r0, #1 +@ strb r0, [r4, #0xf] +@_08069108: +@ ldrb r0, [r4, #0xf] +@ subs r0, #1 +@ strb r0, [r4, #0xf] +@ lsls r0, r0, #0x18 +@ lsrs r1, r0, #0x18 +@ cmp r1, #0 +@ bne _0806911C +@ movs r0, #3 +@ strb r0, [r4, #0xc] +@ strb r1, [r4, #0xd] +@_0806911C: +@ adds r0, r4, #0 +@ bl sub_0806924C +@ pop {r4, r5, pc} thumb_func_start sub_08069124 sub_08069124: @ 0x08069124 diff --git a/include/entity.h b/include/entity.h index 30dd6d97..37b242cd 100644 --- a/include/entity.h +++ b/include/entity.h @@ -124,13 +124,14 @@ typedef struct Entity u8 field_0x5e; u8 field_0x5f; u16 spriteVramOffset; - u8 spriteOffsetX; - u8 spriteOffsetY; + u8 spriteRenderPositionOffset; + u8 field_0x63; u32 * otherEntity; - u8 field_0x68; - u8 field_0x69; + u16 field_0x68; u16 field_0x6a; - u8 filler4[8]; + u8 field_0x6b; + u8 field_0x6c; + u8 filler4[6]; u32 * heldObjectPtr; u8 filler3[2]; u16 itemCooldown; @@ -142,4 +143,4 @@ typedef struct Entity } Entity; -#endif \ No newline at end of file +#endif diff --git a/linker.ld b/linker.ld index d3d04cff..5566c63a 100644 --- a/linker.ld +++ b/linker.ld @@ -509,6 +509,7 @@ SECTIONS { asm/zeldaFollower.o(.text); asm/melari.o(.text); asm/bladeBrothers.o(.text); + src/cow.o(.text); asm/cow.o(.text); asm/goron.o(.text); asm/goronMerchant.o(.text); diff --git a/src/cow.c b/src/cow.c new file mode 100644 index 00000000..9cacc651 --- /dev/null +++ b/src/cow.c @@ -0,0 +1,127 @@ +#include "global.h" +#include "entity.h" + +extern void sub_0806ED78(Entity*); +extern void sub_0806920C(Entity*); +extern void sub_080042B8(Entity*); +extern u32 sub_0805ACC0(Entity*); +extern u32 sub_0801E99C(Entity*); +extern void sub_0806924C(Entity*); +extern void sub_080AEF88(Entity*); +extern void (*gUnk_08111914[1])(Entity*); +extern void LoadAnimation(); +extern u32 Random(); + +void sub_08068F98(Entity* ent) { + gUnk_08111914[ent->action](ent); + sub_0806ED78(ent); + sub_0806920C(ent); +} + +void sub_08068FC0(Entity* ent) { + u32 r2; + + ent->action = 1; + ent->animationState = ent->entityType.parameter2; + ent->nonPlanarMovement = 0x40; + + ent->field_0x6c = 0xFF; + + r2 = sub_0805ACC0(ent); + if (r2 == 0) { + u16 x, y; + + x = ent->x.HALF.HI; + ent->field_0x68 = x; + + y = ent->y.HALF.HI; + ent->field_0x6a = y; + } else { + ent->field_0x68 = r2 >> 0x10; + ent->field_0x6a = r2; + } + ent->field_0x6b = sub_0801E99C(ent); + + LoadAnimation(ent, ent->animationState + 4); +} + +void sub_08069018(Entity* ent) { + u32 var0; + + if (ent->previousActionFlag == 0) { + ent->previousActionFlag++; + ent->field_0xf = (Random() & 0x3F) + 0x3C; + LoadAnimation(ent, ent->animationState); + } + + sub_080042B8(ent); + var0 = --ent->field_0xf; + var0 = (var0 << 24) >> 24; + if (var0 == 0) { + if (ent->parameter3 == 0) { + ent->action = 2; + } else { + ent->action = 3; + } + ent->previousActionFlag = var0; + } + + sub_0806924C(ent); +} + +void sub_08069068(Entity* ent) { + u32 var0; + + if (ent->previousActionFlag == 0) { + u32 anim; + + ent->previousActionFlag++; + + anim = (Random() & 2) - 1; + anim = (anim + ent->animationState) & 3; + ent->animationState = anim; + ent->direction = anim <<= 3; + + ent->field_0xf = (Random() & 0x3F) + 0x3C; + LoadAnimation(ent, ent->animationState + 4); + } + + sub_080AEF88(ent); + sub_080042B8(ent); + + { + s32 x = ent->x.HALF.HI; + s16* x2 = &ent->field_0x68; + x -= *x2; + if (x > 16) { + ent->x.HALF.HI = *x2 + 16; + ent->field_0xf = 1; + } + if (x < -16) { + ent->x.HALF.HI = *x2 - 16; + ent->field_0xf = 1; + } + } + { + s32 y = ent->y.HALF.HI; + s16* y2 = &ent->field_0x6a; + y -= *y2; + if (y > 16) { + ent->y.HALF.HI = *y2 + 16; + ent->field_0xf = 1; + } + if (y < -16) { + ent->y.HALF.HI = *y2 - 16; + ent->field_0xf = 1; + } + } + + var0 = --ent->field_0xf; + var0 = (var0 << 24) >> 24; + if (var0 == 0) { + ent->action = 3; + ent->previousActionFlag = var0; + } + + sub_0806924C(ent); +}