diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-27 13:42:37 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-27 13:44:06 +0100 |
| commit | bc4d9b6076bb8bcbbbe4aca049c4b425ccee743a (patch) | |
| tree | 9ed95787aa61a00ec407f40512634604a2f1989b /src/object/fourElements.c | |
| parent | 3fddf8f0702d3fd0f7f43cc384ab0ca5eae21497 (diff) | |
Decompile FourElements
Diffstat (limited to 'src/object/fourElements.c')
| -rw-r--r-- | src/object/fourElements.c | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/object/fourElements.c b/src/object/fourElements.c new file mode 100644 index 00000000..daecece1 --- /dev/null +++ b/src/object/fourElements.c @@ -0,0 +1,170 @@ +/** + * @file fourElements.c + * @ingroup Objects + * + * @brief Four Elements object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "hitbox.h" +#include "screen.h" +#include "message.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u16 unk_68; + /*0x6a*/ u8 unk_6a; +} FourElementsEntity; + +extern u32 sub_0805429C(u32); +extern void sub_0807DF50(void); + +extern u16 script_PlayerGetElement[]; + +void FourElements_Init(FourElementsEntity*); +void FourElements_Action1(FourElementsEntity*); +void FourElements_Action2(FourElementsEntity*); +void FourElements_Action3(FourElementsEntity*); +void FourElements_Action4(FourElementsEntity*); +void FourElements_Action5(FourElementsEntity*); +void FourElements_Action6(FourElementsEntity*); +void sub_080A0424(FourElementsEntity*); +void sub_080A0444(FourElementsEntity*); + +void FourElements(FourElementsEntity* this) { + static void (*const FourElements_Actions[])(FourElementsEntity*) = { + FourElements_Init, FourElements_Action1, FourElements_Action2, FourElements_Action3, + FourElements_Action4, FourElements_Action5, FourElements_Action6, + }; + FourElements_Actions[super->action](this); + sub_08080CB4(super); +} + +void FourElements_Init(FourElementsEntity* this) { + Entity* objectAD; + super->action = 1; + super->spriteSettings.draw = 1; + super->spritePriority.b1 = 2; + super->spriteRendering.b3 = 1; + super->hitbox = (Hitbox*)&gHitbox_6; + super->z.HALF.HI = 0xff40; + this->unk_6a = 0x40; + switch (super->type) { + case 0x41: + gScreen.lcd.displayControl &= 0xfdff; + super->collisionLayer = 1; + break; + case 0x40: + case 0x42: + case 0x43: + break; + } + StartPlayerScript(script_PlayerGetElement); + gScreen.controls.layerFXControl = 0x640; + gScreen.controls.alphaBlend = 0x1000; + sub_0805BC4C(); + objectAD = CreateObjectWithParent(super, OBJECT_AD, super->type - 0x40, 0); + if (objectAD != NULL) { + objectAD->parent = super; + super->child = objectAD; + } +} + +void FourElements_Action1(FourElementsEntity* this) { + if ((gActiveScriptInfo.syncFlags & 4) != 0) { + sub_080A0424(this); + if (super->z.HALF.HI < -8) { + super->z.HALF.HI++; + } else { + super->action = 2; + gActiveScriptInfo.syncFlags |= 2; + } + } +} + +void FourElements_Action2(FourElementsEntity* this) { + sub_080A0424(this); + sub_080A0444(this); + if (IsCollidingPlayer(super)) { + DeleteEntity(super->child); + super->spriteSettings.draw = 0; + super->action = 3; + super->actionDelay = 0x2d; + gScreen.controls.layerFXControl = 0x640; + gScreen.controls.alphaBlend = 0; + sub_080A7C18(super->type, 0, 1); + sub_0808C650(super, 1); + SetFade(6, 2); + SoundReq(SFX_F8); + SoundReq(SFX_148); + SoundReq(BGM_ELEMENT_GET); + SoundReq(SONG_BGM_0); + } +} + +void FourElements_Action3(FourElementsEntity* this) { + if (super->actionDelay != 0) { + sub_080A0424(this); + if (--super->actionDelay == 0) { + SetDefaultPriority(&gPlayerEntity, 0); + } + } else { + RequestPriorityDuration(NULL, 0x3c); + if (sub_0808C67C()) { + super->action = 4; + } + } +} + +void FourElements_Action4(FourElementsEntity* this) { + RequestPriorityDuration(NULL, 0x3c); + if (gFadeControl.active == 0) { + super->action = 5; + this->unk_68 = 0x1a4; + } +} + +void FourElements_Action5(FourElementsEntity* this) { + u32 index; + RequestPriorityDuration(NULL, 10); + if (--this->unk_68 == 0) { + super->action = 6; + index = sub_0805429C(super->type); + MessageNoOverlap(index, super); + } +} + +void FourElements_Action6(FourElementsEntity* this) { + RequestPriorityDuration(NULL, 10); + if ((gMessage.doTextBox & 0x7f) == 0) { + SetPriorityTimer(0x5a); + gPlayerState.controlMode = 1; + sub_0807DF50(); + SetRoomFlag(0); + DeleteThisEntity(); + } +} + +void sub_080A0424(FourElementsEntity* this) { + if (--this->unk_6a == 0) { + this->unk_6a = 0x40; + SoundReq(SFX_178); + } +} + +void sub_080A0444(FourElementsEntity* this) { + static const u8 gUnk_081248B4[] = { + 249, 248, 247, 246, 245, 246, 247, 248, + }; + super->z.HALF.HI = gUnk_081248B4[(super->field_0xf++ >> 3) & 7] << 0x18 >> 0x18; +} + +void sub_080A0464(FourElementsEntity* this, ScriptExecutionContext* context) { + Entity* element = FindEntityByID(6, FOUR_ELEMENTS, 6); + if (element != NULL) { + sub_0807DEDC(super, context, element->x.HALF.HI, element->y.HALF.HI + 0x18); + } +} |
