#pragma once

#include "global.h"
#include "types.h"

#include "Game/GameModePlay.hpp"
#include "Render/FadeControl.hpp"
#include "System/SysNew.hpp"
#include "Unknown/UnkStruct_02037750.hpp"

class UnkStruct_020fadf4_Base : public SysObject {
public:
    unk32 func_ov009_021136c4();
    unk32 func_ov009_0211370c();
};

class UnkStruct_0211a9ac : public SysObject {
public:
    /* 000 */ unk8 pad[0x354];
    /* 354 */

    UnkStruct_0211a9ac();
    ~UnkStruct_0211a9ac();

    void func_ov002_020f50c0(unk32 param_1);
    void func_ov002_020f5390(u16 *param_1);
    void func_ov002_020f5504(u16 *param_1);
    void func_ov002_020f56c8(u16 *param_1);
};

// ov003
class UnkStruct_020fadf4 : public UnkStruct_020fadf4_Base {
public:
    /* 00 */ unk8 pad[0x4c];
    /* 4c */

    UnkStruct_020fadf4();
    UnkStruct_020fadf4(UnkStruct_0211a9ac *param_1);
    ~UnkStruct_020fadf4();

    void func_ov009_021135d0();
    void func_ov003_020fae64();
};

class UnkStruct_020f2978_00 {
public:
    /* 000 (vtable) */
    /* 04 */ unk8 pad[0x14];
    /* 18 */

    /* 00 */ virtual void vfunc_00(); // func_ov000_020d0670
    /* 04 */ virtual void vfunc_04(); // func_ov000_020cff1c
    /* 08 */ virtual void vfunc_08(); // func_ov000_020d0000
    /* 0c */ virtual void vfunc_0c(); // func_ov000_020d0048
    /* 10 */ virtual void vfunc_10(); // func_ov000_020cff8c

    UnkStruct_020f2978_00();
    ~UnkStruct_020f2978_00();
};

// ov003
class UnkStruct_020f2978 : public SysObject {
public:
    /* 00 */ UnkStruct_020f2978_00 mUnk_00[2];
    /* 30 */ UnkStruct_02037750 mUnk_30;
    /* 50 */ unk8 pad2[0x88 - 0x50];
    /* 88 */

    UnkStruct_020f2978();

    unk32 func_ov003_020f2a2c();
    unk32 func_ov003_020f2acc();
};

class UnkStruct_0211ac0c : public UnkStruct_020fadf4_Base {
public:
    /* 00 */ unk32 mUnk_00;
    /* 04 */ FadeControl mUnk_04;
    /* 28 */ unk8 pad[0x44 - 0x28];
    /* 44 */

    UnkStruct_0211ac0c();
    UnkStruct_0211ac0c(UnkStruct_020f2978 *param_1);

    void func_ov009_0211372c();
    void func_ov003_020fb26c();
    unk32 func_ov009_021136e8();
    unk32 func_ov003_020fb148();
    unk32 func_ov003_020fb258(u16 *param_1);
    void func_ov009_0211ac2c();
    void func_ov003_020faf90();
    void func_ov003_020fb010();
};

class GameModeAdventure : public GameModePlay {
public:
    /* 000 (base) */
    /* 008 */ UnkStruct_0211a9ac *mUnk_008;
    /* 00c */ UnkStruct_020fadf4 *mUnk_00c;
    /* 010 */ UnkStruct_020f2978 *mUnk_010;
    /* 014 */ UnkStruct_0211ac0c *mUnk_014;
    /* 018 */

    /* 00 */ virtual ~GameModeAdventure() override;
    /* 08 */ virtual unk32 vfunc_08(bool param1) override;
    /* 0c */ virtual void vfunc_0c(u16 *param1) override;
    /* 10 */ virtual void vfunc_10(u16 *param1) override;
    /* 14 */ virtual void vfunc_14(u16 *param1) override;
    /* 1c */ virtual void vfunc_1c() override;
    /* 20 */ virtual void vfunc_20() override;
    /* 24 */

    GameModeAdventure(unk32 param1);
    static GameModeAdventure *Create(unk32 param1);
};
