diff options
| author | Tal Hayon <talhayon1@gmail.com> | 2022-01-11 12:58:21 +0200 |
|---|---|---|
| committer | Tal Hayon <talhayon1@gmail.com> | 2022-01-11 12:58:21 +0200 |
| commit | d852efec297525af490dc2c7daa06b8f7d1a7db5 (patch) | |
| tree | 060c091565e04d0396411322cbfa95e8b06296fc /src/object | |
| parent | c3bada6cd04e5af9f1f0e7174c315b7a5d859a26 (diff) | |
| parent | 688508b1afb97606c605f1d91c2b9fc773573ca0 (diff) | |
Merge remote-tracking branch 'upstream/master' into takkuri
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/barrelInside.c | 14 | ||||
| -rw-r--r-- | src/object/gyorgBossObject.c | 443 | ||||
| -rw-r--r-- | src/object/objectAF.c | 2 | ||||
| -rw-r--r-- | src/object/steam.c | 6 |
4 files changed, 460 insertions, 5 deletions
diff --git a/src/object/barrelInside.c b/src/object/barrelInside.c index 4448f9d2..ea09fd37 100644 --- a/src/object/barrelInside.c +++ b/src/object/barrelInside.c @@ -1,10 +1,10 @@ #include "entity.h" -extern u8 gUnk_08120C80[]; -extern u8 gUnk_08120C92[]; +const u8 gUnk_08120C80[]; +const u8 gUnk_08120C92[]; void BarrelInside(Entity* this) { - u8* ptr; + const u8* ptr; if (this->action == 0) { this->action = 1; this->spriteSettings.draw = 1; @@ -27,3 +27,11 @@ void BarrelInside(Entity* this) { } } } + +const u8 gUnk_08120C80[] = { + 2, 5, 2, 2, 5, 2, 3, 4, 2, 3, 6, 3, 3, 5, 3, 3, 6, 3, +}; + +const u8 gUnk_08120C92[] = { + 4, 6, 7, 0, 0, 0, +}; diff --git a/src/object/gyorgBossObject.c b/src/object/gyorgBossObject.c new file mode 100644 index 00000000..ea0dc245 --- /dev/null +++ b/src/object/gyorgBossObject.c @@ -0,0 +1,443 @@ +#define NENT_DEPRECATED +#include "global.h" +#include "entity.h" +#include "object.h" +#include "area.h" +#include "room.h" +#include "screen.h" +#include "functions.h" +#include "enemy/gyorg.h" + +extern const ScreenTransitionData gUnk_0813ABD0; + +extern u32 sub_08079F8C(void); +extern s16* const gUnk_08124FF0[]; + +extern void sub_080A1DCC(GyorgBossObjectEntity*); +extern void sub_080A1C9C(GyorgBossObjectEntity*); +void sub_080A1E54(GyorgBossObjectEntity*); + +void sub_080A1D8C(GyorgBossObjectEntity*, s32); + +void sub_080A1FF0(GyorgBossObjectEntity*); +u32 sub_080A20B8(GyorgBossObjectEntity*, GyorgMaleEntity*); +void sub_080A1D70(GyorgBossObjectEntity*, u32); + +void sub_080A1704(GyorgBossObjectEntity*); +void sub_080A184C(GyorgBossObjectEntity*); +void sub_080A189C(GyorgBossObjectEntity*); +void sub_080A190C(GyorgBossObjectEntity*); +void sub_080A1990(GyorgBossObjectEntity*); +void sub_080A19FC(GyorgBossObjectEntity*); +void sub_080A1A80(GyorgBossObjectEntity*); +void sub_080A1AE8(GyorgBossObjectEntity*); +void sub_080A1B4C(GyorgBossObjectEntity*); +void sub_080A1C04(GyorgBossObjectEntity*); + +void GyorgBossObject(Entity* this) { + static void (*const gUnk_08124ED0[])(GyorgBossObjectEntity*) = { + sub_080A1704, sub_080A184C, sub_080A189C, sub_080A190C, sub_080A1990, + sub_080A19FC, sub_080A1A80, sub_080A1AE8, sub_080A1B4C, sub_080A1C04, + }; + gUnk_08124ED0[this->action]((GyorgBossObjectEntity*)this); + sub_080A1DCC((GyorgBossObjectEntity*)this); + sub_080A1C9C((GyorgBossObjectEntity*)this); +} + +void sub_080A1704(GyorgBossObjectEntity* this) { + GyorgHeap* heap; + Entity* tmp; + if (CheckFlags(0x7B)) { + DeleteThisEntity(); + } + if (gEntCount > 0x45) + return; + heap = zMalloc(sizeof(GyorgHeap)); + if (!heap) + return; + super->action = 1; + super->myHeap = heap; + this->unk_6e = 0x258; + this->unk_6c = 0; + heap->boss = this; + tmp = CreateEnemy(GYORG_FEMALE, 0); + tmp->myHeap = heap; + heap->female = (GyorgFemaleEntity*)tmp; + tmp = CreateEnemy(GYORG_MALE, 0); + tmp->x.HALF.HI = gRoomControls.origin_x + 0x200; +#ifdef EU + tmp->y.HALF.HI = gRoomControls.origin_y + 0x380; +#else + tmp->y.HALF.HI = gRoomControls.origin_y + 0x330; +#endif + tmp->myHeap = heap; + heap->male1 = (GyorgMaleEntity*)tmp; + tmp = CreateEnemy(GYORG_MALE, 1); + tmp->x.HALF.HI = gRoomControls.origin_x + 0x260; +#ifdef EU + tmp->y.HALF.HI = gRoomControls.origin_y + 0x360; +#else + tmp->y.HALF.HI = gRoomControls.origin_y + 0x310; +#endif + tmp->myHeap = heap; + heap->male2 = (GyorgMaleEntity*)tmp; + gScreen.bg3.control = 0x1E07; + gScreen.lcd.displayControl |= 0x800; + this->unk_70 = 0; + this->unk_72 = 0; + this->unk_74 = 0; + this->unk_7a = 0; + this->unk_76 = 0xc0; + this->unk_78 = 0xc0; + gRoomTransition.field_0x39 = 1; + gPlayerState.flags |= 0x20000; + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +#ifndef EU + SoundReq(0x80100000); + gArea.bgm = gArea.queued_bgm; +#endif +} + +void sub_080A184C(GyorgBossObjectEntity* this) { + if (--this->unk_6e == 0) { + super->action = 2; + this->unk_6c = 8; + ((GyorgHeap*)super->myHeap)->female->base.health = 8; + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A189C(GyorgBossObjectEntity* this) { + if (((GyorgHeap*)super->myHeap)->female->base.health == 0) { + super->action = 3; + super->actionDelay = 0x23; + this->unk_6c = 1; + this->unk_78 = 0x400; + this->unk_7b = 1; + ((GyorgHeap*)super->myHeap)->male1->base.health = 0xC; + SoundReq(0x128); + InitScreenShake(0x96, 1); + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A190C(GyorgBossObjectEntity* this) { + sub_080A1FF0(this); + if (((GyorgHeap*)super->myHeap)->male1->base.health == 0) { + if (sub_080A20B8(this, ((GyorgHeap*)super->myHeap)->male1)) { + super->action = 4; + this->unk_6c = 0x10; + this->unk_78 = 0xC0; + sub_080A1D70(this, ((GyorgHeap*)super->myHeap)->female->base.animationState); + ((GyorgHeap*)super->myHeap)->female->base.health = 0x18; + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; + } else { + gPlayerState.startPosX = ((GyorgHeap*)super->myHeap)->male1->base.x.HALF.HI; + gPlayerState.startPosY = ((GyorgHeap*)super->myHeap)->male1->base.y.HALF.HI; + } +} + +void sub_080A1990(GyorgBossObjectEntity* this) { + if (((GyorgHeap*)super->myHeap)->female->base.health == 0) { + ((GyorgHeap*)super->myHeap)->male1->base.health = 0xC; + super->action = 5; + super->actionDelay = 0x23; + this->unk_6c = 2; + this->unk_78 = 0x400; + this->unk_7b = 1; + SoundReq(0x128); + InitScreenShake(0x96, 1); + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A19FC(GyorgBossObjectEntity* this) { + sub_080A1FF0(this); + if (((GyorgHeap*)super->myHeap)->male2->base.health == 0) { + if (sub_080A20B8(this, ((GyorgHeap*)super->myHeap)->male2)) { + super->action = 6; + this->unk_6c = 0x20; + this->unk_78 = 0xc0; + sub_080A1D70(this, ((GyorgHeap*)super->myHeap)->female->base.animationState); + ((GyorgHeap*)super->myHeap)->female->base.health = 0x18; + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; + } else { + gPlayerState.startPosX = ((GyorgHeap*)super->myHeap)->male2->base.x.HALF.HI; + gPlayerState.startPosY = ((GyorgHeap*)super->myHeap)->male2->base.y.HALF.HI; + } +} + +void sub_080A1A80(GyorgBossObjectEntity* this) { + if (((GyorgHeap*)super->myHeap)->female->base.health == 0) { + ((GyorgHeap*)super->myHeap)->male2->base.health = 0xC; + super->action = 7; + super->actionDelay = 0x23; + this->unk_6c = 0x104; + this->unk_78 = 0x400; + SoundReq(SFX_BOSS_DIE); + InitScreenShake(0x96, 1); + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A1AE8(GyorgBossObjectEntity* this) { + sub_080A1FF0(this); + if (((GyorgHeap*)super->myHeap)->male2->base.health == 0) { + if (sub_080A20B8(this, ((GyorgHeap*)super->myHeap)->male2)) { + super->action = 8; + this->unk_6c = 0x40; + this->unk_78 = 0xC0; + ((GyorgHeap*)super->myHeap)->female->base.health = 0xC; + } + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A1B4C(GyorgBossObjectEntity* this) { + if (((GyorgHeap*)super->myHeap)->female->base.health == 0) { + if (this->unk_6c != 0) { + InitScreenShake(0x2d, 1); + SoundReq(SFX_BOSS_DIE); + this->unk_78 = 0x600; + } + this->unk_6c = 0; + gRoomTransition.field_0x39 = 0; + if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) { + super->action = 9; + super->actionDelay = 0; + super->field_0xf = 0xF0; + this->unk_6e = 0x1a4; + super->direction = 0; + super->speed = 0x60; + gPlayerState.flags &= ~0x20000; + CopyPosition(&gPlayerEntity, super); + gRoomControls.camera_target = super; + SetPlayerControl(2); + } + } + gPlayerState.startPosX = gRoomControls.origin_x + 0x200; + gPlayerState.startPosY = gRoomControls.origin_y + 0x210; +} + +void sub_080A1C04(GyorgBossObjectEntity* this) { + if (this->unk_6e == 0) { + LinearMoveUpdate(super); + sub_080A1E54(this); + if (--super->field_0xf == 0) { + SetFlag(0x7B); + sub_0808091C(&gUnk_0813ABD0, 8); + return; + } + if (super->field_0xf == 0x3C) { + SetFade(7, 4); + } + return; + } + if (--this->unk_6e < 0xb4) { + sub_080A1E54(this); + return; + } + switch (this->unk_6e) { + case 0xb4: + SoundReq(SFX_BOSS_DIE); + InitScreenShake(0x2d0, 2); + break; + case 0x12C: + SoundReq(SFX_BOSS_DIE); + InitScreenShake(0x4b, 1); + break; + } +} + +void sub_080A1C9C(GyorgBossObjectEntity* this) { + if (this->unk_7a) { + if (this->unk_74 != this->unk_75) { + this->unk_78 = 0; + sub_080A1D8C(this, 0xC); + if (this->unk_76 == 0) { + this->unk_74 = this->unk_75; + this->unk_78 = this->unk_7c; + } + } else { + sub_080A1D8C(this, 0xC); + if (this->unk_78 == this->unk_76) { + this->unk_7a = 0; + } + } + } else { + sub_080A1D8C(this, 8); + } + this->unk_70 += gSineTable[this->unk_74] * this->unk_76 / 0x100; + this->unk_72 -= gSineTable[this->unk_74 + 0x40] * this->unk_76 / 0x100; + gScreen.bg3.xOffset = this->unk_70 >> 0x8; + gScreen.bg3.yOffset = this->unk_72 >> 0x8; +} + +void sub_080A1D70(GyorgBossObjectEntity* this, u32 unk1) { + this->unk_75 = unk1; + this->unk_7a = 1; + this->unk_7c = this->unk_78; +} + +void sub_080A1D8C(GyorgBossObjectEntity* this, s32 unk1) { + if (this->unk_78 != this->unk_76) { + if (this->unk_78 > this->unk_76) { + if (unk1 < this->unk_78 - this->unk_76) { + this->unk_76 += unk1; + } else { + this->unk_76 = this->unk_78; + } + } else { + if (unk1 < this->unk_76 - this->unk_78) { + this->unk_76 -= unk1; + } else { + this->unk_76 = this->unk_78; + } + } + } +} + +void sub_080A1DCC(GyorgBossObjectEntity* this) { + GenericEntity* tmp; + if ((tmp = (GenericEntity*)((GyorgHeap*)super->myHeap)->male1) != NULL || + (tmp = (GenericEntity*)((GyorgHeap*)super->myHeap)->male2) != NULL) { + if (tmp->field_0x7c.BYTES.byte0 && tmp->base.spriteRendering.b3 == 2) { + ((GyorgHeap*)super->myHeap)->unk_10->base.flags &= ~0x80; + tmp = ((GyorgHeap*)super->myHeap)->unk_14; + tmp->base.flags &= ~0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags &= ~0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags &= ~0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags &= ~0x80; + return; + } + } + ((GyorgHeap*)super->myHeap)->unk_10->base.flags |= 0x80; + tmp = ((GyorgHeap*)super->myHeap)->unk_14; + tmp->base.flags |= 0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags |= 0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags |= 0x80; + tmp = (GenericEntity*)tmp->base.child; + tmp->base.flags |= 0x80; +} + +void sub_080A1E54(GyorgBossObjectEntity* this) { + Entity* fx; + if ((++super->actionDelay & 0x1F) == 0) { + fx = CreateFx(super, 0x51, 0); + if (fx) { + u32 r = Random(); + fx->x.HALF.HI = gRoomControls.origin_x + 0x200 + (r & 0xf0) - 0x78; + fx->y.HALF.HI = gRoomControls.origin_y + 0x210 + ((r >> 8) & 0x70) - 0x38; + fx->spritePriority.b0 = 5; + fx->collisionLayer = 2; + UpdateSpriteForCollisionLayer(fx); + } + } +} + +void sub_080A1ED0(u32 unk0, u32 unk1, u32 unk2) { + static const u16 gUnk_08124EF8[] = { 0x200, 0x1C0, 0x250, 0x210, 0x200, 0x260, 0x1B0, 0x210 }; + u32 i = 0; + s16* p; + u32 x, y; + x = gUnk_08124EF8[unk2 * 2] + gRoomControls.origin_x; + y = gUnk_08124EF8[unk2 * 2 + 1] + gRoomControls.origin_y; + p = gUnk_08124FF0[unk0]; + while (*p != 1) { + GyorgChildEntity* tmp = (GyorgChildEntity*)CreateEnemy(GYORG_CHILD, unk1); + if (tmp) { + tmp->base.type2 = i++; + tmp->base.x.HALF.HI = x; + tmp->base.y.HALF.HI = y; + tmp->base.direction = DirectionFromAnimationState(unk2); + tmp->unk_7a = DirectionTurnAround(DirectionFromAnimationState(unk2)); + tmp->unk_78 = p[2]; + switch (unk2) { + case 0: + tmp->unk_74 = p[0]; + tmp->unk_76 = -p[1]; + break; + case 1: + tmp->unk_74 = p[1] + 0xF0; + tmp->unk_76 = p[0]; + break; + case 2: + tmp->unk_74 = p[0]; + tmp->unk_76 = p[1] + 0xA0; + break; + case 3: + tmp->unk_74 = -p[1]; + tmp->unk_76 = p[0]; + break; + } + } + p += 3; + } + if (unk1 == 0) { + Entity* tmp; + tmp = CreateObject(SPECIAL_FX, 2, 0); + if (tmp) { + tmp->x.HALF.HI = x; + tmp->y.HALF.HI = y; + tmp->spriteOrientation.flipY = 3; + tmp->spriteRendering.b3 = 3; + tmp->collisionLayer = 1; + } + } +} + +void sub_080A1FF0(GyorgBossObjectEntity* this) { + if (super->actionDelay != 0) { + super->actionDelay--; + if (super->actionDelay <= 0x20 && (super->actionDelay & 0xF) == 0) { + Entity* fx; + fx = CreateFx(super, 0x51, 0); + if (fx) { + u32 r = Random(); + fx->x.HALF.HI = gRoomControls.origin_x + 0x200 + (r & 0x78) - 0x3C; + fx->y.HALF.HI = gRoomControls.origin_y + 0x210 + (r & 0x78) - 0x3C; + fx->spritePriority.b0 = 6; + fx->collisionLayer = 1; + UpdateSpriteForCollisionLayer(fx); + } + } + } + if (this->unk_7b) { + if (sub_0806FCB8(&gPlayerEntity, gRoomControls.origin_x + 0x200, gRoomControls.origin_y + 0x210, 0x100)) { + if (super->actionDelay == 0) { + super->actionDelay = 0x78; + } else { + if (super->actionDelay == 0x23) { + InitScreenShake(0x1e, 0); + } + } + } else { + this->unk_7b = 0; + } + } +} + +u32 sub_080A20B8(GyorgBossObjectEntity* this, GyorgMaleEntity* other) { + if (other == NULL) { + return 1; + } + if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) { + return other->unk_7c == 0 && gPlayerState.field_0x14 != 0; + } + return 0; +} diff --git a/src/object/objectAF.c b/src/object/objectAF.c index 0aff1ed3..f34ff4f2 100644 --- a/src/object/objectAF.c +++ b/src/object/objectAF.c @@ -47,7 +47,7 @@ void sub_080A0624(Entity* this) { void sub_080A0640(Entity* this) { if (this->type == 0) { - PositionRelative(*(Entity**)(this->parent->myHeap + 0x4), this, 0, 0x80000); + PositionRelative(*(((Entity**)this->parent->myHeap) + 4), this, 0, 0x80000); } else { CopyPosition(this->parent, this); } diff --git a/src/object/steam.c b/src/object/steam.c index afa616be..eaf2938e 100644 --- a/src/object/steam.c +++ b/src/object/steam.c @@ -5,7 +5,7 @@ #include "room.h" #include "asm.h" -extern u8 gUnk_08123484[]; +const u8 gUnk_08123484[]; typedef struct { Entity base; @@ -57,3 +57,7 @@ void Steam(Entity* _this) { super->spriteOffsetX = gUnk_08123484[super->field_0xf]; super->spriteOffsetY = gUnk_08123484[super->field_0xf] + *ptr; } + +const u8 gUnk_08123484[] = { + 0xfc, 0xfd, 0xfe, 0xff, 0x0, 0x1, 0x2, 0x3, 0x4, 0x3, 0x2, 0x1, 0x0, 0xff, 0xfe, 0xfd, +}; |
