diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2022-03-21 18:41:42 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-21 18:41:42 -0700 |
| commit | 177fca186b73252fa60ac4465d04edab762e104b (patch) | |
| tree | 12bd9a56b23cc2aa4cb221e64efbd4049cbf2f4a /src | |
| parent | f57f815879ca5d743557125341bf583b48bbdeaf (diff) | |
| parent | 48679171804e423eb79d76ace1e912866710c5ec (diff) | |
Merge pull request #459 from EllipticEllipsis/MazaalBossObject
Diffstat (limited to 'src')
| -rw-r--r-- | src/enemy/flyingPot.c | 4 | ||||
| -rw-r--r-- | src/object/mazaalBossObject.c | 207 |
2 files changed, 209 insertions, 2 deletions
diff --git a/src/enemy/flyingPot.c b/src/enemy/flyingPot.c index 93f87543..abba834c 100644 --- a/src/enemy/flyingPot.c +++ b/src/enemy/flyingPot.c @@ -96,7 +96,7 @@ void FlyingPot_OnCollision(FlyingPotEntity* this) { if (super->bitfield == 0x9D) { super->action = FLYING_POT_ACTION_6; - super->flags &= ~0x80; + COLLISION_OFF(super); super->zVelocity = 0x2A000; super->spritePriority.b1 = 1; @@ -143,7 +143,7 @@ void FlyingPot_SubAction2(FlyingPotEntity* this) { if (super->actionDelay == 0) { sub_08037418(this); super->actionDelay = 1; - super->flags &= ~0x80; + COLLISION_OFF(super); super->spriteOffsetX = 0; SetTile(this->tileIndex, TILE(super->x.HALF.HI, super->y.HALF.HI), super->collisionLayer); diff --git a/src/object/mazaalBossObject.c b/src/object/mazaalBossObject.c new file mode 100644 index 00000000..27f42ffb --- /dev/null +++ b/src/object/mazaalBossObject.c @@ -0,0 +1,207 @@ +#define NENT_DEPRECATED +#include "global.h" +#include "entity.h" +#include "enemy.h" +#include "functions.h" +#include "item.h" +#include "object.h" +#include "player.h" +#include "new_player.h" +#include "room.h" +#include "screen.h" +#include "sound.h" + +extern u16 script_Object89Mazaal[]; + +typedef struct { + /* 0x00 */ Entity base; + /* 0x68 */ u8 unk_68[0x1C]; + /* 0x84 */ ScriptExecutionContext* cutsceneBeh; +} MazaalBossObjectEntity; + +enum MazaalBossObjectActions { + /* 0 */ MAZAAL_BOSS_OBJECT_ACTION_0, + /* 1 */ MAZAAL_BOSS_OBJECT_ACTION_1, + /* 2 */ MAZAAL_BOSS_OBJECT_ACTION_2, + /* 3 */ MAZAAL_BOSS_OBJECT_ACTION_3, + /* 4 */ MAZAAL_BOSS_OBJECT_ACTION_4, + /* 5 */ MAZAAL_BOSS_OBJECT_ACTION_5, + /* 6 */ MAZAAL_BOSS_OBJECT_ACTION_6, + /* 7 */ MAZAAL_BOSS_OBJECT_ACTION_7, + /* 8 */ MAZAAL_BOSS_OBJECT_ACTION_8, +}; + +void MazaalBossObject_Action0(MazaalBossObjectEntity* this); // 0809AB04 +void MazaalBossObject_Action1(MazaalBossObjectEntity* this); // 0809ABA4 +void MazaalBossObject_Action2(MazaalBossObjectEntity* this); // 0809ABB0 +void MazaalBossObject_Action3(MazaalBossObjectEntity* this); // 0809ABD4 +void MazaalBossObject_Action4(MazaalBossObjectEntity* this); // 0809ABF4 +void MazaalBossObject_Action5(MazaalBossObjectEntity* this); // 0809AC3C +void MazaalBossObject_Action6(MazaalBossObjectEntity* this); // 0809ACA0 +void MazaalBossObject_Action7(MazaalBossObjectEntity* this); // 0809ACCC +void MazaalBossObject_Action8(MazaalBossObjectEntity* this); // 0809ACE8 +void sub_0809AD68(MazaalBossObjectEntity* this); // 0809AD68 +void sub_0809AD8C(MazaalBossObjectEntity* this); // 0809AD8C + +void MazaalBossObject(Entity* thisx) { + static void (*const MazaalBossObject_Actions[])(MazaalBossObjectEntity*) = { + MazaalBossObject_Action0, MazaalBossObject_Action1, MazaalBossObject_Action2, + MazaalBossObject_Action3, MazaalBossObject_Action4, MazaalBossObject_Action5, + MazaalBossObject_Action6, MazaalBossObject_Action7, MazaalBossObject_Action8, + }; + + MazaalBossObject_Actions[thisx->action]((MazaalBossObjectEntity*)thisx); +} + +void MazaalBossObject_Action0(MazaalBossObjectEntity* this) { + Entity* mazaalHead; + + if (CheckFlags(0x31)) { + sub_0809AD68(this); + sub_0809AD8C(this); + DeleteThisEntity(); + } + + mazaalHead = CreateEnemy(MAZAAL_HEAD, 0); + if (mazaalHead == NULL) { + return; + } + + CopyPosition(super, mazaalHead); + super->child = mazaalHead; + + if (gRoomTransition.field_0x38 != 0) { + if (gRoomTransition.field_0x39 != 0) { + DeleteThisEntity(); + } + + super->action = MAZAAL_BOSS_OBJECT_ACTION_7; + super->spriteSettings.draw = 0; + gRoomControls.camera_target = super; + sub_080809D4(); + } else { + super->action = 1; + super->actionDelay = 30; + super->frameIndex = gRoomTransition.field_0x38; + super->spritePriority.b0 = 7; + super->spriteOffsetY = 0x20; + + this->cutsceneBeh = StartCutscene(super, script_Object89Mazaal); + } +} + +void MazaalBossObject_Action1(MazaalBossObjectEntity* this) { + ExecuteScriptForEntity(super, NULL); +} + +void MazaalBossObject_Action2(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_3; + super->actionDelay = 120; + gRoomControls.camera_target = super->child; + } +} + +void MazaalBossObject_Action3(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_4; + super->actionDelay = 90; + super->child->subAction = 1; + } +} + +void MazaalBossObject_Action4(MazaalBossObjectEntity* this) { + if (super->child->subAction > 2) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_5; + super->actionDelay = 8; + super->field_0xf = 0; + super->spriteRendering.alphaBlend = BLDALPHA_BLEND(1, 0); + + gScreen.controls.layerFXControl = + BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG0 | BLDCNT_EFFECT_BLEND; + gScreen.controls.alphaBlend = BLDALPHA_BLEND(0x10, 0); + } + } +} + +void MazaalBossObject_Action5(MazaalBossObjectEntity* this) { + u32 tmp; + + if (--super->actionDelay == 0) { + super->actionDelay = 8; + + tmp = ++super->field_0xf; + tmp &= 0xFF; + gScreen.controls.alphaBlend = BLDALPHA_BLEND((0x10 - tmp) & 0xFF, tmp); + + if (super->field_0xf > 15) { + super->spriteRendering.alphaBlend = BLDALPHA_BLEND(4, 0); + gScreen.controls.layerFXControl = 0; + super->action = MAZAAL_BOSS_OBJECT_ACTION_6; + super->actionDelay = 15; + super->spriteSettings.draw = 0; + } + } +} + +void MazaalBossObject_Action6(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->child->subAction = 6; + gRoomTransition.field_0x38 = 0xF1; + + DeleteEntity(super); + } +} + +void MazaalBossObject_Action7(MazaalBossObjectEntity* this) { + if (super->child->actionDelay == 1) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_8; + super->subAction = 0; + super->actionDelay = 180; + } +} + +void MazaalBossObject_Action8(MazaalBossObjectEntity* this) { + switch (super->subAction) { + default: + if (--super->actionDelay == 0) { + super->actionDelay = 90; + super->subAction = 1; + SoundReq(SFX_SECRET_BIG); + SetFlag(0x31); + sub_0809AD8C(this); + } + break; + case 1: + if (--super->actionDelay == 0) { + super->actionDelay = 120; + super->subAction = 2; + sub_0809AD68(this); + } + break; + case 2: + if (--super->actionDelay == 0) { + gRoomControls.camera_target = &gNewPlayerEntity.base; + gPlayerState.controlMode = CONTROL_1; + DeleteThisEntity(); + } + break; + } +} + +void sub_0809AD68(MazaalBossObjectEntity* this) { + LoadRoomEntityList(GetCurrentRoomProperty(super->type)); + if (GetInventoryValue(ITEM_OCARINA) != 0) { + LoadRoomEntityList(GetCurrentRoomProperty(super->type2)); + } +} + +void sub_0809AD8C(MazaalBossObjectEntity* this) { + Entity* archway = CreateObject(ARCHWAY, 0x22, 0); + + if (archway != NULL) { + archway->x.HALF.HI = gRoomControls.origin_x + 0xB8; + archway->y.HALF.HI = gRoomControls.origin_y + 8; + } +} |
