diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-17 16:03:04 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-18 20:49:00 +0100 |
| commit | 4a1d2fb406d32a76765f0eff396bebb70ff397cd (patch) | |
| tree | eef8412057b1d2207a490f9d421be6ec32520edd /src | |
| parent | 8d86343827cb79b5ceca4f775cf9aec9732dad30 (diff) | |
Decompile ObjectOnSpinyBeetle
Diffstat (limited to 'src')
| -rw-r--r-- | src/object/objectOnSpinyBeetle.c | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/src/object/objectOnSpinyBeetle.c b/src/object/objectOnSpinyBeetle.c new file mode 100644 index 00000000..56336a0d --- /dev/null +++ b/src/object/objectOnSpinyBeetle.c @@ -0,0 +1,305 @@ +/** + * @file objectOnSpinyBeetle.c + * @ingroup Objects + * + * @brief Object on Spiny Beetle object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; +} ObjectOnSpinyBeetleEntity; + +extern void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*); +extern const s8 gUnk_08123558[]; + +void sub_08098918(ObjectOnSpinyBeetleEntity*); +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity*); +void sub_080989C0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity*); + +void ObjectOnSpinyBeetle(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Init, ObjectOnSpinyBeetle_Action1, ObjectOnSpinyBeetle_Action2, + ObjectOnSpinyBeetle_Action3, ObjectOnSpinyBeetle_Action4, ObjectOnSpinyBeetle_Action5, + }; + ObjectOnSpinyBeetle_Actions[super->action](this); +} + +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->flags |= ENT_COLLIDE; + super->spritePriority.b0 = 6; + super->spriteRendering.b3 = 2; + super->field_0xf = 0; + super->hitType = 0x6e; + super->flags2 = 0x86; + super->field_0x16 = 0; + if (super->type != 0) { + super->field_0x1c = 2; + } else { + super->field_0x1c = 1; + } + SortEntityBelow(super, super->parent); + sub_08098918(this); +} + +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent != NULL) { + if (4 < parent->action) { + sub_080989C0(this); + return; + } + if ((super->bitfield & 0x80) != 0) { + switch (super->bitfield & 0x3f) { + case 0x13: + super->action = 3; + super->subAction = 0; + break; + case 0xf: + case 0x1d: + super->action = 4; + super->zVelocity = 0x2a000; + super->spriteOffsetY = 0; + super->spriteSettings.shadow = 1; + super->spritePriority.b1 = 3; + super->flags &= ~ENT_COLLIDE; + (super->parent)->child = NULL; + ObjectOnSpinyBeetle_Action4(this); + break; + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 0xb: + case 0xc: + case 0xd: + case 0x10: + case 0x11: + case 0x12: + case 0x18: + case 0x19: + case 0x1a: + if (super->type == 0 || (gPlayerState.field_0xac & 8) != 0) { + sub_080989C0(this); + } + break; + case 0x14: + case 0x16: + case 0x20: + if (super->type == 0) { + sub_080989C0(this); + } + } + } else { + sub_08098918(this); + sub_08078930(super); + } + } else { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action2Subaction0, ObjectOnSpinyBeetle_Action2Subaction1, + ObjectOnSpinyBeetle_Action2Subaction2, ObjectOnSpinyBeetle_Action2Subaction3, + ObjectOnSpinyBeetle_Action2Subaction4, ObjectOnSpinyBeetle_Action2Subaction5, + ObjectOnSpinyBeetle_Action2Subaction6, + }; + ObjectOnSpinyBeetle_Action2Subactions[super->subAction](this); +} + +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->flags |= ENT_COLLIDE; + super->field_0x3c = 7; + super->hitType = 1; + super->flags2 = gPlayerEntity.flags2; + super->spriteOffsetY = 0; + (super->parent)->child = NULL; + super->subAction += 1; +} + +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity* this) { + super->spritePriority.b1 = 3; +} + +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity* this) { + switch (sub_080043E8(super)) { + case 2: + CreateFx(super, FX_WATER_SPLASH, 0); + break; + case 1: + CreateFx(super, FX_FALL_DOWN, 0); + break; + case 3: + CreateFx(super, FX_LAVA_SPLASH, 0); + break; + default: + sub_080989C0(this); + return; + } + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity* this) { + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.heldObject == 0) { + ObjectOnSpinyBeetle_Action2Subaction6(this); + } +} + +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->subAction = 0; +} + +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action3Subaction0, ObjectOnSpinyBeetle_Action3Subaction1, + ObjectOnSpinyBeetle_Action3Subaction2, ObjectOnSpinyBeetle_Action3Subaction3, + ObjectOnSpinyBeetle_Action3Subaction4, ObjectOnSpinyBeetle_Action3Subaction5, + }; + + ObjectOnSpinyBeetle_Action3Subactions[super->subAction](this); + if ((super->subAction < 2) && (ObjectOnSpinyBeetle_GetParent(this) == NULL)) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->subAction = 1; + super->field_0x1d = 0x30; + super->actionDelay = 0; +} + +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity* this) { + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + super->spriteOffsetX = 0; + super->action = 1; + } else { + sub_0806F4E8(super); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity* this) { + if (super->actionDelay == 0) { + super->actionDelay = 1; + super->spriteOffsetX = 0; + super->spriteOffsetY = -2; + (super->parent)->child = NULL; + } + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + sub_080989C0(this); + } else { + if ((sub_0806F3E4(super) != 0) && (super->type == 0)) { + DeleteThisEntity(); + } + } +} + +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.field_0x1c == 0) { + sub_080989C0(this); + } else { + (this->base).flags &= ~ENT_COLLIDE; + } +} + +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity* this) { + if (super->zVelocity < 0) { + super->spriteSettings.flipY = 1; + } + if (GravityUpdate(super, 0x2000) == 0) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void sub_08098918(ObjectOnSpinyBeetleEntity* this) { + static const s8 gUnk_08123558[] = { 1, 2, 2, 2, 0, -3, -3, -4, -3, -4, -3, -3, -3, 0, 0, 0 }; + u16 tmp; + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent == NULL) { + sub_080989C0(this); + } else { + CopyPosition(parent, super); + tmp = parent->flags & 0x80; + if ((parent->flags & ENT_COLLIDE) != 0) { + if (super->field_0xf == 0) { + super->field_0xf += 1; + super->spritePriority.b0 = 3; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = gUnk_08123558[parent->frame & 0xf] - 8; + super->spriteOffsetY = 0; + } else { + if (super->field_0xf != 0) { + super->field_0xf = tmp; + super->spritePriority.b0 = 6; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = tmp; + super->spriteOffsetY = 3; + } + } +} + +void sub_080989C0(ObjectOnSpinyBeetleEntity* this) { + if (ObjectOnSpinyBeetle_GetParent(this) != NULL) { + (super->parent)->child = NULL; + } + CreateFx(super, super->type + FX_BUSH, 0); + DeleteThisEntity(); +} + +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = super->parent; + if ((parent != NULL) && (parent->next == NULL)) { + parent = NULL; + } + return parent; +} |
