#pragma once

#include "MapObject/MapObject.hpp"
#include "Player/PlayerGet.hpp"

class MapObject_UnkStruct1 {
public:
    /* 00 (vtable) */
    /* 04 */ unk32 mUnk_44;
    /* 08 */ unk16 mUnk_48;
    /* 0A */ s16 mUnk_4A;
    /* 0C */ VecFx32 mUnk_4C;
    /* 18 */

    MapObject_UnkStruct1(); // func_ov000_02073194 & func_ov000_020731c4

    // data_ov000_020b2290
    /* 00 */ virtual void vfunc2_00();
    /* 04 */ virtual void vfunc2_04();
    /* 08 */ virtual void vfunc2_08();
    /* 0C */ virtual void vfunc2_0C();
};

class MapObject_UnkStruct1_Derived1 : public MapObject_UnkStruct1 {
public:
    /* 00 (base) */
    /* 18 */ bool mUnk_58;
    /* 19 */ unk8 mUnk_59;
    /* 1A */ s16 mUnk_5A;
    /* 1C */ VecFx32 mUnk_5C;
    /* 28 */

    MapObject_UnkStruct1_Derived1(); // func_ov000_02073234

    // data_ov000_020b22a8
    /* 0C */ virtual void vfunc2_0C() override;
};

class MapObject_UnkStruct1_Derived2 : public MapObject_UnkStruct1_Derived1 {
public:
    /* 00 (base) */
    /* 28 */

    // data_ov031_021150a0
    /* 04 */ virtual void vfunc2_04() override;
    /* 08 */ virtual void vfunc2_08() override;
};

class MapObjectDoorBase : public MapObject, public MapObject_UnkStruct1_Derived2 {
public:
    /* 00 (base MapObject) */
    /* 40 (base MapObject_UnkStruct1_Derived2) */
    /* 68 */ UnkStruct_PlayerGet_ec mUnk_68;
    /* 6C */ unk32 mUnk_6C;
    /* 70 */ unk32 mUnk_70;
    /* 74 */ unk32 mUnk_74;
    /* 78 */ u16 mUnk_78;
    /* 7A */ u16 mUnk_7A;
    /* 7C */ u16 mUnk_7C;
    /* 7E */ u16 mUnk_7E;
    /* 80 */ unk16 mUnk_80;
    /* 82 */ u16 mUnk_82;
    /* 84 */ u16 mUnk_84;
    /* 86 */ bool mUnk_86;
    /* 87 */ bool mUnk_87;
    /* 88 */ bool mUnk_88;
    /* 89 */ bool mUnk_89;
    /* 8A */ bool mUnk_8A;
    /* 8B */ bool mUnk_8B;
    /* 8C */ bool mUnk_8C;
    /* 8D */ bool mUnk_8D;
    /* 8E */ bool mUnk_8E;
    /* 8F */ bool mUnk_8F;
    /* 90 */ bool mUnk_90;
    /* 91 */ bool mUnk_91;
    /* 91 */ unk8 mUnk_92; // pad?
    /* 91 */ unk8 mUnk_93; // pad?
    /* 94 */

    MapObjectDoorBase();

    // data_ov031_02115008 (MapObject)
    /* 08 */ virtual void vfunc_08() override;
    /* 0C */ virtual void vfunc_0C() override;

#ifdef DOORBASE_DTOR_NOINLINE
    //! TODO: hacky trick to match function order (pch hint?)
    /* 30 */ virtual ~MapObjectDoorBase() override;
#else
    /* 30 */ virtual ~MapObjectDoorBase() override {}
#endif

    // (MapObject_UnkStruct1_Derived2)
    /* 04 */ virtual void vfunc2_04() override;
    /* 08 */ virtual void vfunc2_08() override;

    // (MapObject)
    /* 40 */ virtual void vfunc_40();
    /* 44 */ virtual void vfunc_44();
    /* 48 */ virtual void vfunc_48();
    /* 4C */ virtual void vfunc_4C();
    /* 50 */ virtual void vfunc_50();
    /* 54 */ virtual void vfunc_54();
    /* 58 */ virtual void vfunc_58();
    /* 5C */ virtual void vfunc_5C(unk32 param1, unk32 param2);
    /* 60 */ virtual void vfunc_60();
    /* 64 */ virtual bool vfunc_64();
    /* 68 */ virtual bool vfunc_68();
    /* 6C */ virtual bool vfunc_6C();
    /* 70 */ virtual void vfunc_70();
    /* 74 */ virtual void vfunc_74();
    /* 78 */ virtual void vfunc_78();
    /* 7C */ virtual void vfunc_7C();
    /* 80 */ virtual void vfunc_80();
    /* 84 */ virtual void vfunc_84(unk32 param1, VecFx32 *param2, unk16 *param3);
    /* 88 */ virtual bool vfunc_88();
    /* 8C */ virtual unk32 vfunc_8C();
    /* 90 */

    void func_ov031_020fbf10(bool param1, bool param2);
    void func_ov031_020fcb78(s8 *param1, s8 param2);
    void func_ov031_020fcd40();
    void func_ov031_020fcf0c(unk32 param1);
    bool func_ov031_020fcf30();
};

struct UnkStruct_ov031_021150b0 {
    /* 00 */ u32 mUnk_00;

    UnkStruct_ov031_021150b0(u32 val) :
        mUnk_00(val) {}
};
