diff options
| author | theo3 <arisstephenson2@gmail.com> | 2020-08-03 12:15:05 -0700 |
|---|---|---|
| committer | theo3 <arisstephenson2@gmail.com> | 2020-08-03 12:15:05 -0700 |
| commit | b4a34e01bfee05b081f35844b08c9abb2e5ef9a4 (patch) | |
| tree | fcca7db4165a49798562768ec5540e4b23abe2c5 /src/object | |
| parent | 0d39bb7f11112a13b2e2df975570672a304ea819 (diff) | |
object2A.c ok
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/minecart.c | 225 | ||||
| -rw-r--r-- | src/object/object2A.c | 40 |
2 files changed, 265 insertions, 0 deletions
diff --git a/src/object/minecart.c b/src/object/minecart.c new file mode 100644 index 00000000..eff15d3a --- /dev/null +++ b/src/object/minecart.c @@ -0,0 +1,225 @@ +#include "global.h" +#include "entity.h" +#include "functions.h" +#include "room.h" + +typedef struct { + u16 field_0x0; + u16 field_0x2; + u8 field_0x4; + u8 field_0x5; + u8 field_0x6; + u8 field_0x7; +} struct_030010EC; + +extern void (*const gUnk_081223A8[])(Entity*); + +extern struct_030010EC gUnk_030010EC[]; +extern BoundingBox gUnk_080FD310; + +void Minecart(Entity* this) { + gUnk_081223A8[this->action](this); + this->bitfield = 0; +} + +void sub_080916EC(Entity* this) { + struct_030010EC* unk = &gUnk_030010EC[this->actionDelay]; + + *(struct_030010EC**)&this->cutsceneBeh.HWORD = unk; + if ((gRoomControls.roomID != unk->field_0x4) || (gLinkState.flags.all & 0x1000) != 0) { + DeleteThisEntity(); + } + this->x.HALF.HI = gRoomControls.roomOriginX + ((unk->field_0x0 & 0x3f) << 4) + 8; + this->y.HALF.HI = gRoomControls.roomOriginY + ((unk->field_0x0 & 0xfc << 4) >> 2) + 8; + this->animationState = unk->field_0x5; + this->entityType.parameter = unk->field_0x6; + this->action = 1; + this->boundingBox = &gUnk_080FD310; + this->flags |= 0x80; + this->damageType = 1; + this->field_0x3c = 0x47; + this->field_0x40 = 0x44; + this->flags2 = 0x80; + this->direction = this->animationState << 3; + this->nonPlanarMovement = 0x700; + this->spritePriority.b1 = 3; + InitAnimationForceUpdate(this, this->entityType.parameter + 4 + this->animationState); + SetTile(0x4022, COORD_TO_TILE(this), this->collisionLayer); +} + +void sub_080917DC(Entity* this) { + + if ((this->bitfield & 0x7f) == 0x1d) { + this->field_0x20 = 0x2a000; + this->action = 7; + InitAnimationForceUpdate(this, this->entityType.parameter + 4 + this->animationState); + PlaySFX(0x13b); + } else { + if (sub_0800445C(this) != 0) { + if (((gLinkState.flags.all & 0x40080) == 0) && (gLinkState.field_0x1c == 0) && + (gLinkState.heldObject == 0) && (gLinkState.jumpStatus == 0)) { + this->actionDelay++; + } else { + this->actionDelay = 0; + } + } else { + this->actionDelay = 0; + } + if ((this->entityType).parameter == 0) { + if (8 < this->actionDelay) { + this->action = this->action + 1; + gLinkState.jumpStatus = 0x81; + gLinkState.flags.all |= 0x4000000; + gLinkEntity.field_0x20 = 0x20000; + gLinkEntity.nonPlanarMovement = 0x100; + gLinkEntity.flags &= 0x7f; + ResetLink(); + sub_0807A108(); + PlaySFX(0x7c); + } + } else { + this->actionDelay = 0; + } + } +} + +void sub_080918A4(Entity *this) +{ + if (sub_080041A0(this, &gLinkEntity, 2, 2) != 0) { + gLinkEntity.x.HALF.HI = this->x.HALF.HI; + gLinkEntity.y.HALF.HI = this->y.HALF.HI; + if (gLinkEntity.height.HALF.HI > -0x10) { + if ((s32)gLinkEntity.field_0x20 > -1) { + return; + } + gLinkEntity.animationState = this->animationState << 1; + gLinkState.flags.all = (gLinkState.flags.all ^ 0x4000000) | 0x1000; + this->action++; + this->field_0xf = 1; + this->flags |= 0x20; + this->damageType = 0x97; + this->field_0x3c = (gLinkEntity.field_0x3c + 1) | 0x20; + this->flags2 = gLinkEntity.flags2; + this->field_0x40 = 0x18; + this->field_0x44 = 8; + sub_0801766C(this); + sub_0807BA8C(COORD_TO_TILE(this), this->collisionLayer); + PlaySFX(0x137); + } + } + else { + gLinkEntity.direction = GetFacingDirection(&gLinkEntity, this); + } + if (gLinkEntity.field_0x20 < 0) { + gLinkEntity.spritePriority.b0 = this->spritePriority.b0 - 1; + } +} + +#if 0 + +typedef struct { + u8 field_0x0; + u8 field_0x1; +} struct_081223C8; + +extern struct_081223C8 gUnk_081223C8[]; + +extern u32 gUnk_081223D8[]; + +void sub_080919AC(Entity *this) +{ + u32 iVar2; + u32 uVar3; + u32 uVar4; + struct_081223C8* temp; + + gRoomControls.unk5 = 7; + if ((gLinkState.flags.all & 0x1000) == 0) { + this->action = 1; + } + else { + if ((gLinkEntity.frames.all & 0xf) == 0) { + this->flags = this->flags & 0x7f; + CopyPosition(this,&gLinkEntity); + if ((gLinkEntity.frames.all & 0xf0) == 0x10) { + this->spriteOffsetY = 1; + } + else { + this->spriteOffsetY = 0; + } + } + else { + this->flags = this->flags | 0x80; + gLinkEntity.nonPlanarMovement = 0; + sub_0806F69C(this); + CopyPosition(this,&gLinkEntity); + gLinkEntity.spritePriority.b0 = this->spritePriority.b0 - 1; + if (!sub_08091DDC(this)) { + if ((gUnk_030010A0.field_0x0 & 0xf) == 0) { + PlaySFX(0x138); + } + + if (--this->field_0xf == 0xff) { + PlaySFX(0x7b); + this->field_0xf = 0x3c; + } + uVar3 = sub_03005800(this, gUnk_081223C8[this->animationState].field_0x0, gUnk_081223C8[this->animationState].field_0x1); + iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[this->animationState]); + if (iVar2 == 0) { + this->direction = this->direction ^ 0x10; + this->animationState = this->animationState ^ 2; + } + else { + switch(uVar3) { + case 100: + this->flags = this->flags & 0xdf; + this->damageType = 1; + this->field_0x3c = 0x47; + this->field_0x40 = 0x44; + this->flags2 = 0x80; + this->action = 6; + sub_08017744(this); + gLinkState.jumpStatus = 0x41; + gLinkState.flags.all = (gLinkState.flags.all ^ 0x1000) | 0x4000000; + gLinkEntity.field_0x20 = 0x20000; + gLinkEntity.nonPlanarMovement = 0x200; + gLinkEntity.animationState = this->animationState << 1; + gLinkEntity.direction = this->direction; + gLinkEntity.flags |= 0x80; + sub_08004168(this); + InitAnimationForceUpdate(this, this->animationState + 0xc); + PlaySFX(0x78); + PlaySFX(0x139); + return; + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + if (uVar3 == sub_080002B8()) { + sub_08091C0C(this); + gLinkEntity.animationState *= 2; + return; + } + } + } + gLinkEntity.animationState *= 2; + if (this->animIndex == this->animationState) { + UpdateAnimationSingleFrame(this); + } + else { + InitAnimationForceUpdate(this, this->animationState); + } + } + } + } +} +#else +NAKED +void sub_080919AC(Entity *this) { + asm(".include \"asm/non_matching/minecart/sub_080919AC.inc\""); +} +#endif
\ No newline at end of file diff --git a/src/object/object2A.c b/src/object/object2A.c new file mode 100644 index 00000000..d8f30b54 --- /dev/null +++ b/src/object/object2A.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "entity.h" +#include "functions.h" +#include "flags.h" + +extern void (*const gUnk_08120DD0[])(Entity*); + +void Object2A(Entity* this) { + gUnk_08120DD0[this->action](this); +} + +void sub_08089B18(Entity *this) +{ + this->action = 1; + this->spriteSettings.b.draw = TRUE; + if (this->entityType.parameter != 0) { + this->actionDelay = this->entityType.parameter; + } + InitializeAnimation(this, 0); + switch (this->entityType.form) { + case 1: + this->y.HALF.HI -= 8; + this->actionDelay = 0x28; + break; + case 2: + this->actionDelay = 0xf; + sub_08004168(this); + break; + case 3: + CopyPosition(this->parent, this); + break; + case 4: + if (!CheckFlags(this->field_0x86)) { + this->spriteSettings.b.draw = FALSE; + this->previousActionFlag = 1; + return; + } + } + sub_08004488(0x124); +}
\ No newline at end of file |
