#define NENT_DEPRECATED
#include "entity.h"
#include "player.h"
#include "functions.h"
#include "asm.h"
#include "effects.h"

typedef struct {
    Entity base;
    u8 filler[0x4];
    u32 unk6c;
} Object1FEntity;

void Object1F_Init(Object1FEntity*);
void Object1F_Action1(Object1FEntity*);
void Object1F_Action2(Object1FEntity*);

void Object1F(Entity* this) {
    static void (*const actionFuncs[])(Object1FEntity*) = {
        Object1F_Init,
        Object1F_Action1,
        Object1F_Action2,
    };

    actionFuncs[this->action]((Object1FEntity*)this);
}

typedef struct {
    u8 animationState;
    u8 unk1;
    u8 unk2;
    u8 spriteVramOffset;
} gUnk_08120A18_struct;

void Object1F_Init(Object1FEntity* this) {
    static const gUnk_08120A18_struct gUnk_08120A18[] = {
        { 0x0, 0x2, 0xA, 0xE8 },
        { 0x0, 0x5, 0x20, 0xE0 },
    };
    static const s8 gUnk_08120A20[] = { 0, -18, 16, 0, 0, 12, -16, 0 };

    u32 temp;
    super->action = 1;
    super->zVelocity = 0x2c000;
    super->direction = super->animationState << 2 ^ 0x10;
    if (super->animationState == 0) {
        super->spritePriority.b0--;
    }
    super->x.HALF.HI = gUnk_08120A20[super->animationState] + super->x.HALF.HI;
    super->y.HALF.HI = gUnk_08120A20[super->animationState + 1] + super->y.HALF.HI;

    super->spriteVramOffset = gUnk_08120A18[super->field_0xf].spriteVramOffset;
    temp = gUnk_08120A18[super->field_0xf].unk1;
    super->palette.b.b0 = temp;
    this->unk6c = gUnk_08120A18[super->field_0xf].unk2;
    super->collisionLayer = gPlayerEntity.collisionLayer;
    super->speed = 0x100;
    InitializeAnimation(super, gUnk_08120A18[super->field_0xf].animationState);
}

void Object1F_Action1(Object1FEntity* this) {
    u32 uVar1;

    if (this->unk6c) {
        this->unk6c--;
        uVar1 = gPlayerState.field_0x3c[1];
    } else {
        ProcessMovement2(super);
        uVar1 = GravityUpdate(super, 0x2800);
    }

    if (uVar1 == 0) {
        super->action = 2;
    }
}

void Object1F_Action2(Object1FEntity* this) {
    u8 bVar1;

    bVar1 = sub_080B1B0C(super);
    switch (bVar1) {
        case 0x21:
            CreateFx(super, FX_FALL_DOWN, 0);
            break;
        case 0x25:
            CreateFx(super, FX_LAVA_SPLASH, 0);
            break;
        case 0x24:
        case 0x30:
            CreateFx(super, FX_WATER_SPLASH, 0);
            break;
        default:
            if (super->type2 != 0) {
                if (super->type2 == 15) {
                    CreateFx(super, super->actionDelay, 0x80);
                } else {
                    CreateObjectWithParent(super, super->type2, super->actionDelay, 0);
                }
            }
    }
    DeleteThisEntity();
}
