From 76483d30c3604b71fe21e69b078945028024a3d3 Mon Sep 17 00:00:00 2001 From: theo3 Date: Tue, 15 Sep 2020 19:22:47 -0700 Subject: [PATCH] start bird.c --- asm/bird.s | 363 ------------------------------------ include/functions.h | 3 + linker.ld | 1 + src/object/bird.c | 144 ++++++++++++++ src/object/heartContainer.c | 4 +- src/object/objectA8.c | 2 +- 6 files changed, 150 insertions(+), 367 deletions(-) create mode 100644 src/object/bird.c diff --git a/asm/bird.s b/asm/bird.s index 0542b6c6..77672bbf 100644 --- a/asm/bird.s +++ b/asm/bird.s @@ -6,369 +6,6 @@ .text - - thumb_func_start Bird -Bird: @ 0x0809CF24 - push {lr} - ldr r2, _0809CF38 @ =gUnk_08123EC0 - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809CF38: .4byte gUnk_08123EC0 - - thumb_func_start sub_0809CF3C -sub_0809CF3C: @ 0x0809CF3C - push {lr} - ldr r2, _0809CF50 @ =gUnk_08123EEC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809CF50: .4byte gUnk_08123EEC - - thumb_func_start sub_0809CF54 -sub_0809CF54: @ 0x0809CF54 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #0x31 - strb r0, [r4, #0xe] - movs r0, #1 - strb r0, [r4, #0xf] - ldr r0, _0809CFDC @ =0xFFFE8000 - str r0, [r4, #0x20] - ldr r0, _0809CFE0 @ =0xFFC74000 - str r0, [r4, #0x34] - adds r1, r4, #0 - adds r1, #0x68 - movs r0, #0xf8 - lsls r0, r0, #8 - strh r0, [r1] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r4, #0x24] - movs r0, #8 - strb r0, [r4, #0x15] - subs r1, #0x30 - movs r0, #2 - strb r0, [r1] - ldr r0, _0809CFE4 @ =gRoomControls - ldrh r0, [r0, #0xa] - strh r0, [r4, #0x2e] - ldr r0, _0809CFE8 @ =0x00000123 - bl PlaySFX - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - movs r1, #0 - bl InitAnimationForceUpdate - movs r0, #0x95 - movs r1, #1 - movs r2, #0 - bl CreateObject - adds r5, r0, #0 - cmp r5, #0 - beq _0809CFD8 - str r4, [r5, #0x50] - movs r3, #0x80 - lsls r3, r3, #0xc - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0 - bl PositionRelative - adds r0, r4, #0 - adds r1, r5, #0 - bl ResolveEntityOnTop -_0809CFD8: - pop {r4, r5, pc} - .align 2, 0 -_0809CFDC: .4byte 0xFFFE8000 -_0809CFE0: .4byte 0xFFC74000 -_0809CFE4: .4byte gRoomControls -_0809CFE8: .4byte 0x00000123 - - thumb_func_start sub_0809CFEC -sub_0809CFEC: @ 0x0809CFEC - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - adds r0, r4, #0 - adds r0, #0x68 - movs r2, #0 - ldrsh r1, [r0, r2] - adds r0, r4, #0 - bl sub_08003FC4 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _0809D018 - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0 - bne _0809D026 - strb r0, [r4, #0xf] - b _0809D026 -_0809D018: - adds r0, r4, #0 - bl sub_080040A8 - cmp r0, #0 - bne _0809D026 - bl DeleteThisEntity -_0809D026: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809D030 -sub_0809D030: @ 0x0809D030 - push {lr} - ldr r2, _0809D044 @ =gUnk_08123EF4 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809D044: .4byte gUnk_08123EF4 - - thumb_func_start sub_0809D048 -sub_0809D048: @ 0x0809D048 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #1 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - movs r1, #0x17 - bl InitAnimationForceUpdate - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809D06C -sub_0809D06C: @ 0x0809D06C - push {lr} - ldr r2, _0809D080 @ =gUnk_08123EFC - ldrb r1, [r0, #0xd] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809D080: .4byte gUnk_08123EFC - - thumb_func_start sub_0809D084 -sub_0809D084: @ 0x0809D084 - push {lr} - adds r1, r0, #0 - ldr r0, [r1, #0x50] - cmp r0, #0 - beq _0809D0A8 - ldrb r2, [r0, #0xf] - cmp r2, #0 - beq _0809D0A0 - movs r3, #0x80 - lsls r3, r3, #0xc - movs r2, #0 - bl PositionRelative - b _0809D0A8 -_0809D0A0: - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - str r2, [r1, #0x20] -_0809D0A8: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0809D0AC -sub_0809D0AC: @ 0x0809D0AC - push {r4, lr} - adds r4, r0, #0 - movs r1, #0xc0 - lsls r1, r1, #5 - bl sub_080044EC - cmp r0, #1 - bhi _0809D0F0 - movs r2, #0 - movs r0, #2 - strb r0, [r4, #0xa] - movs r1, #1 - strb r1, [r4, #0xc] - str r2, [r4, #0x34] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - movs r0, #0x45 - bl SetLocalFlag - movs r0, #0x72 - bl PlaySFX - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0809D0F0 - adds r0, r4, #0 - bl sub_0806FAD8 -_0809D0F0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809D0F4 -sub_0809D0F4: @ 0x0809D0F4 - push {lr} - ldr r2, _0809D108 @ =gUnk_08123F04 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809D108: .4byte gUnk_08123F04 - - thumb_func_start sub_0809D10C -sub_0809D10C: @ 0x0809D10C - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #1 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - movs r1, #0x17 - bl InitAnimationForceUpdate - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809D130 -sub_0809D130: @ 0x0809D130 - push {lr} - adds r2, r0, #0 - ldr r0, _0809D148 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809D14C - adds r0, r2, #0 - bl sub_0800445C - b _0809D170 - .align 2, 0 -_0809D148: .4byte gPlayerState -_0809D14C: - adds r0, r2, #0 - bl sub_08017850 - cmp r0, #0 - beq _0809D170 - movs r0, #0x17 - movs r1, #0 - movs r2, #0 - bl CreateItemEntity - ldr r0, _0809D174 @ =gUnk_02002A40 - ldr r1, [r0, #0x40] - movs r2, #0x80 - lsls r2, r2, #0x15 - orrs r1, r2 - str r1, [r0, #0x40] - bl DeleteThisEntity -_0809D170: - pop {pc} - .align 2, 0 -_0809D174: .4byte gUnk_02002A40 - - thumb_func_start sub_0809D178 -sub_0809D178: @ 0x0809D178 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0809D19C - adds r0, #1 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #2 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r1, r4, #0 - adds r1, #0x5a - movs r0, #0x80 - strb r0, [r1] -_0809D19C: - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809D1E8 - bl Random - movs r1, #3 - ands r1, r0 - adds r0, r4, #0 - bl InitializeAnimation - bl Random - movs r1, #0xf - ands r0, r1 - adds r0, #0x10 - adds r1, r4, #0 - adds r1, #0x59 - strb r0, [r1] - ldrb r1, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - bl Random - movs r1, #1 - ands r1, r0 - cmp r1, #0 - beq _0809D1EE - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - strb r0, [r4, #0x18] - b _0809D1EE -_0809D1E8: - adds r0, r4, #0 - bl GetNextFrame -_0809D1EE: - pop {r4, pc} - thumb_func_start sub_0809D1F0 sub_0809D1F0: @ 0x0809D1F0 push {r4, r5, r6, r7, lr} diff --git a/include/functions.h b/include/functions.h index 8725e18e..b92593e9 100644 --- a/include/functions.h +++ b/include/functions.h @@ -45,6 +45,7 @@ extern u8* GetSpriteSubEntryOffsetDataPointer(u32, u32); extern u32 LoadFixedGFX(Entity*, u32); extern void ExecuteScriptCommandSet(Entity*, void *); extern void _DmaFill32(u32, void*, u32); +extern Entity* CreateItemEntity(u32, u32, u32); // Unidentified extern u32 sub_0806ED78(Entity*); @@ -259,4 +260,6 @@ extern void sub_0802F45C(Entity*); extern u32 sub_0800419C(Entity*, Entity*, u32, u32); extern void sub_08004542(Entity*); extern void sub_08077B20(); +extern u32 sub_080040A8(Entity*); +extern u32 sub_08017850(Entity*); #endif diff --git a/linker.ld b/linker.ld index 4025a042..f30d3071 100644 --- a/linker.ld +++ b/linker.ld @@ -824,6 +824,7 @@ SECTIONS { src/object/bakerOven.o(.text); asm/object93.o(.text); src/object/windTribeFlag.o(.text); + src/object/bird.o(.text); asm/bird.o(.text); asm/object96.o(.text); asm/object97.o(.text); diff --git a/src/object/bird.c b/src/object/bird.c new file mode 100644 index 00000000..83af1b5d --- /dev/null +++ b/src/object/bird.c @@ -0,0 +1,144 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "functions.h" + +extern void (*const gUnk_08123EC0[])(Entity*); +extern void (*const gUnk_08123EEC[])(Entity*); +extern void (*const gUnk_08123EF4[])(Entity*); +extern void (*const gUnk_08123EFC[])(Entity*); +extern void (*const gUnk_08123F04[])(Entity*); + +void Bird(Entity* this) { + gUnk_08123EC0[this->entityType.form](this); +} + +void sub_0809CF3C(Entity* this) { + gUnk_08123EEC[this->action](this); +} + +void sub_0809CF54(Entity* this) { + Entity* target; + + this->action++; + this->spriteSettings.b.draw = TRUE; + this->actionDelay = 0x31; + this->field_0xf = 1; + this->field_0x20 = -0x18000; + this->height.WORD = -0x38C000; + this->field_0x68.HWORD = -0x800; + this->nonPlanarMovement = 0x280; + this->direction = 8; + this->collisionLayer = 2; + this->x.HALF.HI = gRoomControls.roomScrollX; + PlaySFX(0x123); + UpdateSpriteForCollisionLayer(this); + InitAnimationForceUpdate(this, 0); + target = CreateObject(0x95, 1, 0); + if (target != NULL) { + target->parent = this; + PositionRelative(this, target, 0, 0x80000); + ResolveEntityOnTop(this, target); + } +} + +void sub_0809CFEC(Entity* this) { + + sub_0806F69C(this); + sub_08003FC4(this, *(s16*)&this->field_0x68.HWORD); + if (this->actionDelay != 0) { + if (--this->actionDelay == 0) { + this->field_0xf = 0; + } + } else if (sub_080040A8(this) == 0) { + DeleteThisEntity(); + } + UpdateAnimationSingleFrame(this); +} + +void sub_0809D030(Entity* this) { + gUnk_08123EF4[this->action](this); +} + +void sub_0809D048(Entity* this) { + this->action++; + this->collisionLayer = 1; + UpdateSpriteForCollisionLayer(this); + InitAnimationForceUpdate(this, 0x17); +} + +void sub_0809D06C(Entity* this) { + gUnk_08123EFC[this->previousActionFlag](this); +} + +void sub_0809D084(Entity* this) { + u32 temp; + + if (this->parent != NULL) { + temp = this->parent->field_0xf; + if (temp != 0) { + PositionRelative(this->parent, this, 0, 0x80000); + } else { + this->previousActionFlag++; + this->field_0x20 = temp; + } + } +} + +void sub_0809D0AC(Entity* this) { + Entity* fx; + + if (sub_080044EC(this, 0x1800) < 2) { + (this->entityType).form = 2; + this->action = 1; + this->height.WORD = 0; + this->collisionLayer = 1; + SetLocalFlag(0x45); + PlaySFX(0x72); + fx = CreateFx(this, 0x11, 0); + if (fx != NULL) { + sub_0806FAD8(this, fx); + } + } +} + +void sub_0809D0F4(Entity* this) { + gUnk_08123F04[this->action](this); +} + +void sub_0809D10C(Entity* this) { + this->action++; + this->collisionLayer = 1; + UpdateSpriteForCollisionLayer(this); + InitAnimationForceUpdate(this, 0x17); +} + +void sub_0809D130(Entity* this) { + if ((gPlayerState.flags.all & 0x80) != 0) { + sub_0800445C(this); + } else if (sub_08017850(this) != 0) { + CreateItemEntity(0x17, 0, 0); + gUnk_02002A40.windcrests |= 0x10000000; + DeleteThisEntity(); + } +} + +void sub_0809D178(Entity* this) { + + if (this->action == 0) { + this->action++; + this->collisionLayer = 2; + UpdateSpriteForCollisionLayer(this); + this->frames.all = 0x80; + } + if ((this->frames.all & 0x80) != 0) { + InitializeAnimation(this, Random() & 3); + this->frameDuration = (Random() & 0xf) + 0x10; + this->spriteSettings.b.flipX = FALSE; + if ((Random() & 1) != 0) { + this->spriteSettings.b.flipX = TRUE; + } + } else { + GetNextFrame(this); + } +} \ No newline at end of file diff --git a/src/object/heartContainer.c b/src/object/heartContainer.c index d55f7171..9222f36f 100644 --- a/src/object/heartContainer.c +++ b/src/object/heartContainer.c @@ -5,9 +5,7 @@ extern void DeleteThisEntity(); extern void sub_08080CB4(Entity*); -extern int sub_08017850(Entity*); -extern void CreateItemEntity(u32, u32, u32); - +extern u32 sub_08017850(Entity*); static void sub_0808E6A0(Entity*); static void sub_0808E6E4(Entity*); static void sub_0808E714(Entity*); diff --git a/src/object/objectA8.c b/src/object/objectA8.c index ab7713c5..9f4f4bb4 100644 --- a/src/object/objectA8.c +++ b/src/object/objectA8.c @@ -1,7 +1,7 @@ #include "global.h" #include "entity.h" -extern void CreateItemEntity(u32, u32, u32); +extern Entity* CreateItemEntity(u32, u32, u32); extern void DeleteThisEntity(); extern void sub_08080CB4(Entity*);