diff options
| author | theo3 <arisstephenson2@gmail.com> | 2020-08-04 17:18:59 -0700 |
|---|---|---|
| committer | theo3 <arisstephenson2@gmail.com> | 2020-08-04 17:18:59 -0700 |
| commit | 2575c0a63df8770448f92a177a3f45634d7ce45e (patch) | |
| tree | b69c2fe1bc3a4cd0178fb8b47c9e6595ab9f41ca /src/object | |
| parent | 7f7b74cfd5874da1e7bc75756319a38d6fd94660 (diff) | |
| parent | 765047808cf2306fe6130c316213aaf0aab1d0cf (diff) | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/cloud.c | 14 | ||||
| -rw-r--r-- | src/object/greatFairy.c | 13 | ||||
| -rwxr-xr-x | src/object/object48.c | 544 | ||||
| -rw-r--r-- | src/object/object49.c | 2 |
4 files changed, 552 insertions, 21 deletions
diff --git a/src/object/cloud.c b/src/object/cloud.c index 5314d9a4..96ffc659 100644 --- a/src/object/cloud.c +++ b/src/object/cloud.c @@ -47,7 +47,7 @@ void sub_0809F514(Entity* this) { this->action = 1; this->actionDelay = 120; this->spriteSettings.b.draw = 0; - *(u8*)&this->field_0x68 = 12; + this->field_0x68.HALF.LO = 12; gRoomControls.cameraTarget = this; gUnk_02034490 = 255; sub_0809F7BC(this); @@ -81,7 +81,7 @@ void sub_0809F5B0(Entity* this) { void sub_0809F5DC(Entity* this) { this->action = 1; this->spriteSettings.b.draw = 0; - *(u8*)&this->field_0x68 = 12; + this->field_0x68.HALF.LO = 12; } void sub_0809F5F0(Entity* this) { @@ -195,14 +195,8 @@ void sub_0809F7BC(Entity* this) { } void sub_0809F7F4(Entity* this) { - u8 cVar1; - u8* puVar2; - - puVar2 = (u8*)&this->field_0x68; - *puVar2 -= 1; - - if (*puVar2 == 0) { - *puVar2 = 12; + if (--this->field_0x68.HALF.LO == 0) { + this->field_0x68.HALF.LO = 12; PlaySFX(388); } } diff --git a/src/object/greatFairy.c b/src/object/greatFairy.c index 21edd60f..4e2c4d40 100644 --- a/src/object/greatFairy.c +++ b/src/object/greatFairy.c @@ -459,23 +459,16 @@ void sub_08087294(Entity* this) { gUnk_081207A4[this->action](this); } -#ifdef NON_MATCHING void sub_080872AC(Entity* this) { this->spriteSettings.b.draw = 1; this->spriteOrientation.flipY = 1; - this->spriteRendering.b0 = 0; - this->field_0x68 = (u16)(this->x).HALF.HI; - this->field_0x6a = (u16)(this->y).HALF.HI; + this->spriteRendering.b3 = 0; + this->field_0x68.HWORD = this->x.HALF.HI; + this->field_0x6a.HWORD = this->y.HALF.HI; this->direction = (u8)Random() & 0x1F; this->nonPlanarMovement = 32; GreatFairy_InitializeAnimation(this); } -#else -NAKED -void sub_080872AC(Entity* this) { - asm(".include \"asm/greatFairy/sub_080872AC.inc\""); -} -#endif //clang-format off void (*const GreatFairy_Main[])(Entity*) = { diff --git a/src/object/object48.c b/src/object/object48.c new file mode 100755 index 00000000..c2a25071 --- /dev/null +++ b/src/object/object48.c @@ -0,0 +1,544 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "functions.h" +#include "main.h" +#include "menu.h" +#include "npc.h" +#include "position.h" +#include "readKeyInput.h" +#include "structures.h" + +extern bool32 sub_080AE008(Entity*, int, int); +extern int sub_0807A094(int); +extern u32 sub_0801D754(const u8*, u8, u8); +extern u32 sub_080041EC(int, int); +extern u32 sub_080045DA(int, int); + +static bool32 sub_0808E950(void); +static void sub_0808EABC(Entity*); +static Entity* sub_0808EC80(int); +static u32 sub_0808EF6C(Entity*); +static void sub_0808EFF0(Entity*); + +typedef struct { + u8 unk0; + u8 unk1; + u8 unk2; +} PACKED struct_08121CD4; + +typedef struct { + u16 unk0; + u16 unk2; + u16 unk4; + u8 unk6_0 : 3; + u8 unk6_3 : 3; + u8 unk6_6 : 2; + u8 unk7; +} struct_08121D54; + +extern void (*const gUnk_08121C64[])(Entity*); +extern void (*const gUnk_08121CCC[])(Entity*); +extern const int gUnk_08133368[]; +extern const u8 gUnk_085A2E80[]; +extern const struct_08121CD4 gUnk_08121CD4[][4]; +extern const u8 gUnk_08121D10[]; +extern const u8 gUnk_08121D38[][8]; +extern const u16 gUnk_08121D18[][8]; +extern const u8 gUnk_08121D48[]; +extern const struct_08121D54 gUnk_08121D54[]; + +void Object48(Entity* this) { + if (this->currentHealth == 0) { + sub_0808EFF0(this); + } + gUnk_08121C64[this->entityType.form](this); + if (this->animIndex < 64) { + UpdateAnimationSingleFrame(this); + } +} + +void sub_0808E7D8(Entity* this) { + gUnk_08121CCC[this->action](this); +} + +void sub_0808E7F0(Entity* this) { + sub_080AE008(this, 1, 2); + this->palette.b.b0 = 0xF; + this->spriteSettings.b.draw = 0; + this->entityType.parameter = 0xFF; + this->action = 1; +} + +void sub_0808E818(Entity* this) { + u32 var0; + u32 var1; + + if (!sub_0808E950()) { + int var2 = -1; + this->entityType.parameter = var2; + this->field_0x68.HWORD = var2; + this->field_0x6a.HWORD = var2; + this->spriteSettings.b.draw = 0; + return; + } + + if (this->entityType.parameter != gUnk_02019EE0.unk6) { + this->entityType.parameter = gUnk_02019EE0.unk6; + this->field_0x68.HWORD = CheckGlobalFlag(EZERO_1ST) == 0 ? 0x400 : 0x100; + this->field_0x70.BYTES.byte0 = 4; + this->animationState = 2; + var1 = gUnk_08133368[sub_0807A094(1) - 22] & 0xFFFFFF; + sub_0801D754(&gUnk_085A2E80[var1], 31, 1); + } + + if (gUnk_02032EC0.transitionType == 0) { + if (gUnk_03000FF0.heldKeys & L_BUTTON) { + switch (gUnk_03000FF0.newKeys) { + case DPAD_UP: + this->animationState = 0; + break; + case DPAD_RIGHT: + this->animationState = 1; + break; + case DPAD_DOWN: + this->animationState = 2; + break; + case DPAD_LEFT: + this->animationState = 3; + break; + case B_BUTTON: + this->field_0x70.BYTES.byte0 = this->field_0x70.BYTES.byte0 ? 0 : 4; + break; + } + } + } + + this->spriteSettings.b.flipX = this->animationState == 3; + var0 = this->field_0x68.HWORD + this->field_0x70.BYTES.byte0 + this->animationState; + if (this->field_0x6a.HWORD != var0) { + this->field_0x6a.HWORD = var0; + this->spriteIndex = var0 >> 8; + InitAnimationForceUpdate(this, (u8)var0); + } + + this->spriteSettings.b.draw = 2; +} + +static bool32 sub_0808E950(void) { + bool32 result = FALSE; + switch (gUnk_02032EC0.transitionType) { + case 0: + case 4: + case 5: + case 6: + case 7: + result = gUnk_02019EE0.unk8[gUnk_02019EE0.unk6] == 1; + break; + } + return result; +} + +void sub_0808E988(Entity* this) { + if (this->action == 0) { + this->action = 1; + this->spriteIndex = 0x142; + this->entityType.parameter = 0xFF; + sub_080AE008(this, 1, 3); + } + + if (sub_0808E950()) { + int i; + for (i = 6; i != 0; i--) { + if (GetInventoryValue(i)) { + break; + } + } + + if (i != 0) { + if (this->entityType.parameter != i) { + InitAnimationForceUpdate(this, i); + } + this->spriteSettings.b.draw = 2; + return; + } + } + + this->spriteSettings.b.draw = 0; +} + +void sub_0808E9F4(Entity* this) { + if (sub_0808E950() && gUnk_02002A40.unk6) { + this->spriteSettings.b.draw = 2; + } else { + this->spriteSettings.b.draw = 0; + } +} + +void sub_0808EA28(Entity* this) { + u32 var0; + u32 var1; + + if (this->entityType.form == 3) { + if (((struct_02000000 *)0x2000000)->gameLanguage > 1) { + this->spriteSettings.b.draw = 2; + } else { + this->spriteSettings.b.draw = 0; + } + } + + if (this->entityType.form == gUnk_02019EE0.unk6) { + var0 = 12; + var1 = 1; + } else { + if (gUnk_02032EC0.transitionType == 5 && this->entityType.form == gUnk_02019EE0.unk7) { + var0 = 13; + var1 = 2; + } else { + var0 = 14; + var1 = 2; + } + } + + this->palette.b.b0 = var0; + this->spriteRendering.b3 = var1; + sub_0808EABC(this); + gUnk_02019EE0.unk0 |= sub_0808EF6C(this); +} + +void sub_0808EABC(Entity* this) { + int var0 = -72; + int var1 = this->entityType.form * 32 + 40; + int var2 = gUnk_02019EE0.unk6 == this->entityType.form; + switch (gUnk_02032EC0.transitionType) { + case 0: + var0 = 24; + break; + case 3: + case 4: + case 6: + case 7: + if (var2) { + var0 = 42; + var1 = 56; + } + break; + case 5: + switch (gMenu.unk10[this->entityType.form]) { + case 0: + var0 = 42; + var1 = 40; + break; + case 1: + case 2: + var0 = 20; + var1 = 144; + var1 -= (gMenu.unk16 - gMenu.unk10[this->entityType.form]) * 32; + break; + } + break; + case 2: + if (var2) { + var0 = 26; + var1 = 42; + } + break; + default: + if (var2) { + var0 = 8; + var1 = 35; + } + break; + } + + this->field_0x68.HWORD = var0; + this->field_0x6a.HWORD = var1; +} + +void sub_0808EB74(Entity* this) { + Entity* entity = sub_0808EC80(gUnk_02019EE0.unk6); + if (entity) { + this->x.WORD = entity->x.WORD; + this->y.WORD = entity->y.WORD; + this->spriteRendering.b3 = entity->spriteRendering.b3; + sub_0806FAD8(entity, this); + } else { + this->x.HALF.HI = 0xF000; + this->y.HALF.HI = 0xF000; + } +} + +void sub_0808EBB8(Entity* this) { + u32 var0; + u32 x, y; + Entity* entity; + + switch (gUnk_02032EC0.transitionType) { + case 4: + var0 = gMenu.field_0x1 + 4; + break; + case 5: + var0 = 2; + break; + case 6: + var0 = gMenu.field_0x1 == 0 ? 7 : 6; + break; + case 7: + var0 = 4; + break; + case 2: + var0 = 1; + break; + default: + var0 = 0; + break; + } + + x = y = 0xF000; + switch (var0) { + case 0: + break; + case 1: + y = ((struct_02000000 *)0x2000000)->gameLanguage * 16 + 24; + x = 112; + break; + case 2: + var0 = gUnk_02019EE0.unk7; + if (var0 == 4) { + var0 = 7; + } + // Fall through + default: + entity = sub_0808EC80(var0); + if (entity) { + sub_0806FAD8(entity, this); + this->spriteRendering.b3 = entity->spriteRendering.b3; + x = entity->x.HALF.HI; + y = entity->y.HALF.HI; + } + break; + } + + this->x.HALF.HI = x; + this->y.HALF.HI = y; +} + +static Entity* sub_0808EC80(int form) { + Entity* entityA = &gUnk_03003DA0; + Entity* entityB = entityA->field_0x4; + while (entityB != entityA) { + if ((entityB->entityType.type == 0x6 && entityB->entityType.subtype == 0x48) && + form == entityB->entityType.form) { + return entityB; + } + entityB = entityB->field_0x4; + } + return NULL; +} + +void sub_0808ECBC(Entity* this) { + int var0; + int var1; + int var2; + const struct_08121CD4* var3; + + var0 = gMenu.field_0x1; + switch (gUnk_02032EC0.transitionType) { + case 4: + var1 = 1; + break; + case 5: + var0 = gUnk_02019EE0.unk7; + var1 = 2; + break; + case 6: + var1 = 3; + break; + case 7: + var1 = 4; + break; + default: + var1 = 0; + break; + } + + var2 = this->entityType.form - 4; + var3 = &gUnk_08121CD4[var1][var2]; + this->field_0x68.HWORD = var3->unk1; + this->field_0x6a.HWORD = var3->unk2; + if (var3->unk0 == var0) { + this->palette.b.b0 = 13; + } else { + this->palette.b.b0 = 14; + } + + gUnk_02019EE0.unk0 |= sub_0808EF6C(this); +} + +void sub_0808ED64(Entity* this) { + int y = 255; + if (gUnk_02032EC0.transitionType == 1 && gMenu.unk10[1] != 5) { + this->x.HALF.HI = gMenu.unk10[0] * 16 + 28; + y = gMenu.unk10[1] * 16 + 58; + } + this->y.HALF.HI = y; +} + +void sub_0808ED98(Entity* this) { + int y; + if (gUnk_02032EC0.transitionType != 1) { + this->field_0x68.HWORD = 27; + y = -10; + } else { + u32 var0 = gMenu.unk13; + if (var0 > 5) { + var0 = 5; + } + this->field_0x68.HWORD = var0 * 8 + 27; + y = 24; + } + + this->y.HALF.HI = y; + this->field_0x6a.HWORD = y; + this->field_0xf++; + this->spriteOffsetY = gUnk_08121D10[(this->field_0xf / 4) & 0x7]; + sub_0808EF6C(this); +} + +void sub_0808EE00(Entity* this) { + int var0, var1, var2; + + var0 = ((struct_02000000 *)0x2000000)->gameLanguage != 0; + var1 = this->entityType.form - 10; + this->frameIndex = gUnk_08121D38[var0][var1]; + this->x.HALF.HI = gUnk_08121D18[var0][var1]; + this->field_0x68.HWORD = gUnk_08121D18[var0][var1]; + var1 -= var0; + if (gUnk_02032EC0.transitionType != 1) { + var1 = 128; + var2 = 176; + } else { + var2 = 140; + } + + this->field_0x6a.HWORD = var2; + this->palette.b.b0 = gMenu.unk10[1] == 5 && var1 == gMenu.field_0x12 ? 11 : 9; + gUnk_02019EE0.unk0 |= sub_0808EF6C(this); +} + +void nullsub_522(Entity* this) { + +} + +void sub_0808EE98(Entity* this) { + this->actionDelay = gUnk_02032EC0.transitionType; + this->frameIndex = gUnk_08121D48[this->actionDelay]; + if (this->actionDelay != 2) { + this->field_0x68.HWORD = 96; + } else { + this->field_0x68.HWORD = -96; + } + sub_0808EF6C(this); +} + +void sub_0808EED8(Entity* this) { + int var0; + if (gUnk_02032EC0.transitionType != 3) { + this->spriteSettings.b.draw = 0; + } else { + this->spriteSettings.b.draw = 2; + var0 = this->entityType.form - 19; + this->palette.b.b0 = gMenu.field_0x1 == var0 ? 4 : 3; + } +} + +void sub_0808EF24(Entity* this) { + int var0; + if (gUnk_02032EC0.transitionType != 3) { + this->spriteSettings.b.draw = 0; + } else { + this->spriteSettings.b.draw = 2; + if (this->entityType.form == 21) { + var0 = ((struct_02000000 *)0x2000000)->field_0x5; + } else { + var0 = ((struct_02000000 *)0x2000000)->brightnessPref; + } + this->frameIndex = this->lastFrameIndex + var0; + } +} + +static u32 sub_0808EF6C(Entity* this) { + int var0; + u32 var1; + int var2; + u32 var3; + int var4; + s16 var5; + s16 var6; + int var7; + + var6 = this->field_0x68.HWORD; + var0 = var6 - this->x.HALF.HI; + var1 = var0; + if (var0 < 0) { + var1 = -var0; + } + if (var1 < 2) { + this->x.WORD = var6 << 16; + var0 = 0; + } + + var5 = this->field_0x6a.HWORD; + var2 = var5 - this->y.HALF.HI; + var3 = var2; + if (var2 < 0) { + var3 = -var2; + } + if (var3 < 2) { + this->y.WORD = var5 << 16; + var2 = 0; + } + + if ((var0 | var2) == 0) { + return 0; + } + + var4 = var7 = sub_080041EC(var0, var2); + var4 += 128; + var7 = var4 + var7 * 16; + if (this->field_0x6c.HWORD < var7) { + var7 = this->field_0x6c.HWORD; + } + this->nonPlanarMovement = var7; + this->direction = sub_080045DA(var0, var2) >> 3; + sub_0806F69C(this); + return 1; +} + +static void sub_0808EFF0(Entity* this) { + const struct_08121D54* var0; + int var1; + + this->spriteSettings.b.draw = 2; + this->nonPlanarMovement = 0x400; + this->currentHealth = 1; + this->frameIndex = 0xFF; + this->animIndex = 0xFF; + var0 = &gUnk_08121D54[this->entityType.form]; + this->x.HALF.HI = var0->unk2; + this->field_0x68.HWORD = var0->unk2; + this->y.HALF.HI = var0->unk4; + this->field_0x6a.HWORD = var0->unk4; + this->spriteRendering.b3 = var0->unk6_0; + this->spritePriority.b0 = var0->unk6_3; + this->spriteOrientation.flipY = var0->unk6_6; + this->field_0x6c.HWORD = var0->unk0; + var1 = var0->unk7; + if (var1 & 0x80) { + var1 &= 0x7F; + this->frameIndex = var1; + this->lastFrameIndex = var1; + } else { + InitAnimationForceUpdate(this, var1); + } +} diff --git a/src/object/object49.c b/src/object/object49.c index d9551953..a586e520 100644 --- a/src/object/object49.c +++ b/src/object/object49.c @@ -114,7 +114,7 @@ void sub_0808F244(Entity *this) *(u32 *)&this->field_0x78 = 0x100 - this->parent->height.HALF.HI; *(u32 *)&this->field_0x70.WORD = *((u8 *)&this->parent->field_0x7c + 3); sub_0808F2B0(this); - if ((this->parent->field_0x6d & 2) != 0) { + if ((this->parent->field_0x6c.HALF.HI & 2) != 0) { DeleteThisEntity(); } } |
