#pragma once

#include "FileSelect/FileSelectUnkDraw.hpp"
#include "Game/GameModeManager.hpp"
#include "Player/TouchControl.hpp"
#include "Unknown/Common.hpp"
#include "Unknown/UnkStruct_0204a060.hpp"
#include "Unknown/UnkStruct_027e09a4.hpp"
#include "Unknown/UnkStruct_027e09ac.hpp"
#include "Unknown/UnkSystem1.hpp"

class AdventureModeManager_1B8;

class AdventureModeManager_15C_20_00 : public GameModeManagerBase_104 {
public:
    /* 000 (vtable) */
    /* 01C */ unk32 mUnk_01C;
    /* 020 */ UnkSystem2_UnkSubSystem1_Base *mUnk_020;
    /* 024 */ UnkSystem2_UnkSubSystem1_Base *mUnk_024;
    /* 028 */ UnkSystem2_UnkSubSystem8 mUnk_028;
    /* 078 */ UnkSystem2_UnkSubSystem8 mUnk_078;
    /* 0C8 */ UnkSubStruct1_Derived1 mUnk_0C8;
    /* 0F8 */ UnkSystem2_UnkSubSystem1_Derived1 mUnk_0F8;
    /* 158 */ UnkSystem2_UnkSubSystem1_Derived1 mUnk_158;
    /* 1B8 */ UnkSystem2_UnkSubSystem1_Derived4 mUnk_1B8;
    /* 1EC */ UnkSystem2_UnkSubSystem7_Derived2 mUnk_1EC;
    /* 250 */ UnkSystem2_UnkSubSystem1_Derived4 mUnk_250;
    /* 284 */ UnkSystem2_UnkSubSystem7_Derived2 mUnk_284;
    /* 2E8 */ UnkStruct_ov019_020d24c8_28_258 mUnk_2E8;
    /* 300 */ UnkSystem2_UnkSubSystem3 mUnk_300;
    /* 53C */ UnkSystem2_UnkSubSystem3 mUnk_53C;
    /* 778 */ bool mUnk_778;
    /* 779 */ bool mUnk_779;
    /* 77A */ unk16 mUnk_77A;
    /* 77C */

    AdventureModeManager_15C_20_00(bool param1);

    /* 00 */ virtual ~AdventureModeManager_15C_20_00() override;
    /* 08 */ virtual void vfunc_08(Input *pButtons, TouchControl *pTouchControl) override;
    /* 10 */ virtual void vfunc_10(unk8 *param1) override;

    // overlay 17
    bool func_ov017_020c19a0();
    void func_ov017_020c1c80(unk32 param1);

    // overlay 24
    void func_ov024_020ca48c();
    void func_ov024_020ca5c8();
    void func_ov024_020ca658();
};

class AdventureModeManager_15C_28 : public UnkSystem1_ov000_Derived1 {
public:
    /* 00 (base) */
    /* 14 */ unk32 mUnk_14;
    /* 18 */ unk8 mUnk_18;
    /* 19 */ unk8 mUnk_19; // pad?
    /* 1A */ unk8 mUnk_1A; // pad?
    /* 1B */ unk8 mUnk_1B; // pad?
    /* 1C */

    AdventureModeManager_15C_28();

    // data_ov000_020b48d0
    /* 00 */ virtual void vfunc_00(unk32 param1) override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 18 */ virtual void vfunc_18() override;
    /* 1C */ virtual unk32 vfunc_1C(u32 param1, unk32 param2, unk32 param3) override;
    /* 24 */ virtual ~AdventureModeManager_15C_28() override;
};

class AdventureModeManager_15C_20 {
public:
    AdventureModeManager_15C_20_00 *mUnk_00;
    GameModeManagerBase_104 *mUnk_04;

    AdventureModeManager_15C_20(GameModeManagerBase_104 *param1) {
        this->mUnk_04 = param1;
        this->mUnk_00 = NULL;
    }
};

class AdventureModeManager_15C {
public:
    /* 00 */ unk32 mUnk_00;
    /* 04 */ GameModeManagerBase_104 mUnk_04;
    /* 20 */ AdventureModeManager_15C_20 mUnk_20;
    /* 28 */ AdventureModeManager_15C_28 mUnk_28;
    /* 44 */ unk8 mUnk_44;
    /* 45 */ unk8 mUnk_45;
    /* 46 */ unk8 mUnk_46;
    /* 47 */ bool mUnk_47;
    /* 48 */ unk32 mUnk_48;
    /* 4C */

    AdventureModeManager_15C();
    ~AdventureModeManager_15C();

    void func_ov001_020c0920();

    unk32 func_ov017_020c3a00(Input *pButtons, TouchControl *pTouchControl);
    void func_ov017_020c3bc0();
    void func_ov017_020c3c64();
};

class AdventureModeManager_160_28 : public UnkStruct_0204a060_Base {
public:
    AdventureModeManager_160_28() {}

    // data_ov000_020b1ff4
    /* 08 */ virtual bool vfunc_08(unk32 param1) override;
    /* 10 */ virtual bool vfunc_10(void) override;

    void func_ov000_02066218(unk32 param1);
};

class AdventureModeManager_160_18 : public LinkList<AdventureModeManager_160_18> {
public:
    /* 00 (vtable) */
    /* 04 (base) */

    /* 00 */ virtual void vfunc_00();
    /* 04 */ virtual void vfunc_04();
    /* 08 */ virtual void vfunc_08();
    /* 0C */ virtual void vfunc_0C();
    /* 10 */ virtual void vfunc_10();
    /* 14 */ virtual void vfunc_14();
    /* 18 */ virtual void vfunc_18();

    void func_ov006_020b6bcc();
    void func_ov006_020b6c74();
    void func_ov006_020b6c80();
};

class AdventureModeManager_160_14 {
public:
    /* 00 */ STRUCT_PAD(0x00, 0x1C);
    /* 1C */ unk32 mUnk_1C;
    /* 20 */ STRUCT_PAD(0x20, 0x40);
    /* 40 */ AdventureModeManager_160_18 *mUnk_40;
    /* 44 */ unk32 mUnk_44;
    /* 48 */ unk32 mUnk_48;
    /* 4C */ unk32 mUnk_4C;
    /* 50 */ unk8 mUnk_50;
    /* 51 */ bool mUnk_51;

    void func_ov006_020b6938();
};

class AdventureModeManager_160_4C : public UnkStruct_0204a060_Base {
public:
    AdventureModeManager_160_4C() {}

    // data_ov024_020d7ca4
    /* 0C */ virtual bool vfunc_0C(void) override;
};

class AdventureModeManager_160_70 {
public:
    /* 00 */ UnkStruct_0204a060_Base mUnk_00;
    /* 24 */ u8 mUnk_24;
    /* 25 */ bool mUnk_25;
    /* 26 */ bool mUnk_26;
    /* 27 */ bool mUnk_27;
    /* 28 */

    AdventureModeManager_160_70() {
        this->mUnk_25 = false;
        this->mUnk_26 = false;
        this->mUnk_27 = false;
    }
};

class AdventureModeManager_160 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ unk32 mUnk_0C;
    /* 10 */ GameModeManagerBase_104 *mUnk_10;
    /* 14 */ AdventureModeManager_160_14 *mUnk_14;
    /* 18 */ AdventureModeManager_160_18 *mUnk_18;
    /* 1C */ AdventureModeManager_1B8 *mUnk_1C;
    /* 20 */ unk32 mUnk_20;
    /* 24 */ Vec2s mUnk_24;
    /* 28 */ AdventureModeManager_160_28 mUnk_28;
    /* 4C */ AdventureModeManager_160_4C mUnk_4C;
    /* 70 */ AdventureModeManager_160_70 mUnk_70;
    /* 98 */

    AdventureModeManager_160(GameModeManagerBase_104 *param1, AdventureModeManager_1B8 *param2);

    // data_ov024_020d7cc0
    /* 00 */ virtual ~AdventureModeManager_160() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;

    void func_ov024_020c7cfc();
    void func_ov024_020c7d4c(unk32 param1);
    void func_ov024_020c83bc();
    void func_ov024_020c8428();
    void func_ov024_020c8454();
    void func_ov024_020c8484();
    void func_ov024_020c84c4();
    void func_ov024_020c851c(unk32 param1);
};

class AdventureModeManager_164 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x1C);
    /* 1C */

    AdventureModeManager_164(GameModeManagerBase_104 *param1, GameModeManagerBase_004 *param2); // overlay 26

    // data_ov026_0213528c
    /* 00 */ virtual ~AdventureModeManager_164() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
};

class AdventureModeManager_168 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x20);
    /* 20 */ bool mUnk_20;
    /* 21 */ bool mUnk_21;
    /* 24 */

    AdventureModeManager_168(GameModeManagerBase_104 *param1); // overlay 31

    // data_ov031_02116254
    /* 00 */ virtual ~AdventureModeManager_168() override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;

    void func_ov031_0210df60(unk32 param1);
    void func_ov031_0210df70(unk32 param1);
    unk32 func_ov031_0210dfcc();
    unk32 func_ov031_0210dfd8();
};

class AdventureModeManager_16C : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x1C);
    /* 1C */ bool mUnk_1C;
    /* 20 */

    AdventureModeManager_16C(GameModeManagerBase_104 *param1); // overlay 26

    // data_ov026_021352bc
    /* 00 */ virtual ~AdventureModeManager_16C() override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;

    void func_ov026_020d8dd4(unk32 param1);
    unk32 func_ov026_020d8e30();
    unk32 func_ov026_020d8e44();
    void func_ov026_020d8e58();
};

class AdventureModeManager_170_14 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */

    /* 0C */ virtual bool vfunc_0C(void) override;
};

class AdventureModeManager_170 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ GameModeManagerBase_104 *mUnk_0C; // related to game over, set to data_ov008_020b6b5c
    /* 10 */ GameModeManagerBase_104 *mUnk_10;
    /* 14 */ AdventureModeManager_170_14 mUnk_14;
    /* 38 */ unk32 mUnk_38;
    /* 3C */

    AdventureModeManager_170(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7d0c
    /* 00 */ virtual ~AdventureModeManager_170() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 24 */ virtual void vfunc_24() override;
};

class AdventureModeManager_174_Base_10 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */

    /* 0C */ virtual bool vfunc_0C(void) override;
    /* 10 */ virtual bool vfunc_10(void) override;
};

class AdventureModeManager_174_Base : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ GameModeManagerBase_104 *mUnk_0C;
    /* 10 */ AdventureModeManager_174_Base_10 mUnk_10;
    /* 34 */ unk32 mUnk_34;
    /* 38 */ u16 mUnk_38;
    /* 3A */ unk16 mUnk_3A;
    /* 3C */ UnkStruct_027e09ac_14 mUnk_3C;
    /* A4 */ u16 mUnk_A4;
    /* A6 */ u16 mUnk_A6;
    /* A8 */ unk16 mUnk_A8;
    /* AA */ unk16 mUnk_AA;
    /* AC */ unk32 mUnk_AC;
    /* B0 */ unk32 mUnk_B0;
    /* B4 */ Vec2s mUnk_B4;
    /* B8 */

    AdventureModeManager_174_Base(GameModeManagerBase_104 *param1);

    // data_ov024_020d7d58 (vtable)

    void func_ov024_020c88f0();
    void func_ov024_020c8b2c();
};

class AdventureModeManager_178_Base : public AdventureModeManager_174_Base {
public:
    /* 00 (base) */
    /* B8 */

    AdventureModeManager_178_Base(GameModeManagerBase_104 *param1);

    // data_ov024_020d7db8
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
};

class AdventureModeManager_174 : public AdventureModeManager_174_Base {
public:
    /* 00 (base) */
    /* B8 */ unk32 mUnk_B8;
    /* BC */ unk32 mUnk_BC;
    /* C0 */

    AdventureModeManager_174(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7d88
    /* 00 */ virtual ~AdventureModeManager_174() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;
};

class AdventureModeManager_178 : public AdventureModeManager_178_Base {
public:
    /* 00 (base) */
    /* B8 */ unk32 mUnk_B8;
    /* BC */

    AdventureModeManager_178(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7de8
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_17C : public AdventureModeManager_178_Base {
public:
    /* 00 (base) */
    /* B8 */ unk32 mUnk_B8;
    /* BC */

    AdventureModeManager_17C(GameModeManagerBase_104 *param1); // overlay 62

    // data_ov062_02160790
    /* 00 */ virtual ~AdventureModeManager_17C() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_180_18 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */

    AdventureModeManager_180_18() {}

    // data_ov024_020d7e18 vtable
    /* 0C */ virtual bool vfunc_0C(void);
};

class AdventureModeManager_180 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ unk32 mUnk_0C;
    /* 10 */ unk32 mUnk_10;
    /* 14 */ GameModeManagerBase_104 *mUnk_14;
    /* 18 */ AdventureModeManager_180_18 mUnk_18;
    /* 3C */ unk32 mUnk_3C;
    /* 40 */ unk32 mUnk_40;
    /* 44 */ bool mUnk_44;
    /* 44 */ bool mUnk_45;
    /* 48 */

    AdventureModeManager_180(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7e34
    /* 00 */ virtual ~AdventureModeManager_180() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;

    void func_ov024_020c9430(unk32 param1, unk32 param2);
    void func_ov024_020c957c();
    void func_ov024_020c95c4();
};

class AdventureModeManager_184_10_Base : public GameModeManagerBase_104 {
public:
    /* 00 (vtable) */

    AdventureModeManager_184_10_Base(); // func_ov010_020b6690

    // data_ov010_020b8dd0 vtable
    /* 00 */ virtual ~AdventureModeManager_184_10_Base() override;
    /* 08 */ virtual void vfunc_08(Input *pButtons, TouchControl *pTouchControl) override;
    /* 10 */ virtual void vfunc_10(unk8 *param1) override;
    /* 1C */ virtual void vfunc_1C();
    /* 20 */ virtual bool vfunc_20();
    /* 24 */ virtual void vfunc_24();
    /* 28 */ virtual void vfunc_28();
    /* 2C */ virtual void vfunc_2C();
    /* 30 */ virtual void vfunc_30();
    /* 34 */ virtual void vfunc_34();

    void func_ov010_020b7008();
    void func_ov010_020b7054();
};

class AdventureModeManager_184_10 : public AdventureModeManager_184_10_Base {
public:
    /* 00 (base) */
};

class AdventureModeManager_184_14 {
public:
    /* 00 */
};

class AdventureModeManager_184 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ GameModeManagerBase_104 *mUnk_0C;
    /* 10 */ AdventureModeManager_184_10 *mUnk_10;
    /* 14 */ AdventureModeManager_184_14 *mUnk_14;
    /* 18 */ bool mUnk_18;
    /* 19 */ unk8 mUnk_19; // pad?
    /* 1A */ unk8 mUnk_1A; // pad?
    /* 1B */ unk8 mUnk_1B; // pad?

    AdventureModeManager_184(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7e64
    /* 00 */ virtual ~AdventureModeManager_184();
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;

    void func_ov024_020c979c(unk32 param1);
};

class AdventureModeManager_188 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x38);

    AdventureModeManager_188(GameModeManagerBase_104 *param1); // overlay 31

    // data_ov031_021162a0
    /* 00 */ virtual ~AdventureModeManager_188() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_18C_14 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */

    AdventureModeManager_18C_14();

    /* 0C */ virtual bool vfunc_0C(void) override;
    /* 10 */ virtual bool vfunc_10(void) override;
};

class AdventureModeManager_18C_10 {
public:
    /* 0000 */ STRUCT_PAD(0x0000, 0x10E9);
    /* 10E9 */ u8 mUnk_10E9;
    /* 10EA */ unk8 mUnk_10EA; // pad?
    /* 10EB */ unk8 mUnk_10EB; // pad?
    /* 10EC */ u32 mUnk_10EC;

    void func_ov011_020b88ac();
    void func_ov011_020b89f0(unk32 param1);
};

class AdventureModeManager_18C : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ GameModeManagerBase_104 *mUnk_0C;
    /* 0C */ AdventureModeManager_18C_10 *mUnk_10;
    /* 14 */ AdventureModeManager_18C_14 mUnk_14;
    /* 38 */ bool mUnk_38;
    /* 39 */ bool mUnk_39;
    /* 3A */ bool mUnk_3A;
    /* 3B */ unk8 mUnk_3B;
    /* 3C */ unk32 mUnk_3C;
    /* 40 */ Vec2s mUnk_40;
    /* 44 */ unk32 mUnk_44;
    /* 48 */ Vec2s mUnk_48;
    /* 4C */ unk32 mUnk_4C;
    /* 50 */ unk16 mUnk_50;
    /* 52 */ unk16 mUnk_52;
    /* 50 */ unk32 mUnk_54;

    AdventureModeManager_18C(GameModeManagerBase_104 *param1);

    // data_ov024_020d7eb0
    /* 00 */ virtual ~AdventureModeManager_18C() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;

    void func_ov024_020c9c6c();
    void func_ov024_020ca034();
    void func_ov024_020ca068(unk32 param1);
    bool func_ov024_020ca074();
};

class AdventureModeManager_190_10 {
public:
    bool func_ov011_020b8f20(unk32 param1);
};

class AdventureModeManager_190_14 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */

    // data_ov024_020d7efc
    /* 0C */ virtual bool vfunc_0C(void) override;
};

class AdventureModeManager_190;
class AdventureModeManager_190_38 : public UnkStruct_0204a060_Base {
public:
    /* 00 (base) */
    /* 24 */ AdventureModeManager_190 *mpParent;
    /* 28 */

    AdventureModeManager_190_38(AdventureModeManager_190 *pParent) {
        this->mpParent = pParent;
    }

    // data_ov024_020d7ee0
    /* 0C */ virtual bool vfunc_0C(void) override;
};

class AdventureModeManager_190 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ GameModeManagerBase_104 *mUnk_0C;
    /* 10 */ AdventureModeManager_190_10 *mUnk_10;
    /* 14 */ AdventureModeManager_190_14 mUnk_14;
    /* 38 */ AdventureModeManager_190_38 mUnk_38;
    /* 60 */ unk32 mUnk_60;
    /* 64 */

    AdventureModeManager_190(GameModeManagerBase_104 *param1); // overlay 24

    // data_ov024_020d7f18
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;

    void func_ov024_020ca21c();
    bool func_ov024_020ca24c(unk32 param1);
    bool func_ov024_020ca280();
};

class AdventureModeManager_194_0C {
public:
    /* 00 (base) */ STRUCT_PAD(0x00, 0xC4);
    /* C4 */ u8 mUnk_C4;
    /* C8 */
};

class AdventureModeManager_194 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ AdventureModeManager_194_0C *mUnk_0C;
    /* 10 */ STRUCT_PAD(0x10, 0x48);
    /* 48 */

    AdventureModeManager_194(GameModeManagerBase_104 *param1);

    // data_ov031_021162ec
    /* 00 */ virtual ~AdventureModeManager_194() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
    /* 24 */ virtual void vfunc_24() override;
};

class AdventureModeManager_198 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x3C);

    AdventureModeManager_198(GameModeManagerBase_104 *param1); // overlay 58

    // data_ov058_02155e08
    /* 00 */ virtual ~AdventureModeManager_198() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_19C : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x14);
    /* 14 */

    AdventureModeManager_19C(GameModeManagerBase_104 *param1); // overlay 26

    // data_ov026_021352ec
    /* 00 */ virtual ~AdventureModeManager_19C() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 24 */ virtual void vfunc_24() override;
};

class AdventureModeManager_1A0 : public AdventureModeManager_174_Base {
public:
    /* 00 (base) */
    /* B8 */ unk32 mUnk_B8;
    /* BC */

    AdventureModeManager_1A0(GameModeManagerBase_104 *param1); // overlay 62

    // data_ov062_021607c0
    /* 00 */ virtual ~AdventureModeManager_1A0() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_1A4 : public AdventureModeManager_174_Base {
public:
    /* 00 (base) */
    /* B8 */ unk32 mUnk_B8;
    /* BC */

    AdventureModeManager_1A4(GameModeManagerBase_104 *param1); // overlay 62

    // data_ov062_021607f0
    /* 00 */ virtual ~AdventureModeManager_1A4() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 1C */ virtual void vfunc_1C(unk32 param1) override;
    /* 20 */ virtual void vfunc_20(unk32 param1, unk32 param2) override;
};

class AdventureModeManager_1A8 : public FileSelectManager_UnkDrawBase {
public:
    /* 00 (base) */
    /* 0C */ STRUCT_PAD(0x0C, 0x38);

    AdventureModeManager_1A8(GameModeManagerBase_104 *param1); // overlay 88

    // data_ov088_02176068
    /* 00 */ virtual ~AdventureModeManager_1A8() override;
    /* 08 */ virtual void vfunc_08(unk32 param1) override;
    /* 14 */ virtual void vfunc_14(unk32 param1) override;
    /* 18 */ virtual void vfunc_18(unk32 param1) override;
    /* 24 */ virtual void vfunc_24() override;
};

// AdventureMode?
class AdventureModeManager_1AC : public GameModeManagerBase_104 {
public:
    /* 00 (base) */
    /* 1C */

    AdventureModeManager_1AC(); // overlay 24

    // data_ov024_020d7bf4
    /* 00 */ virtual ~AdventureModeManager_1AC() override;
    /* 08 */ virtual void vfunc_08(Input *pButtons, TouchControl *pTouchControl) override;
    /* 10 */ virtual void vfunc_10(unk8 *param1) override;
    /* 14 */ virtual void vfunc_14(unk8 *param1) override;
};

class AdventureModeManager_1B0 : public GameModeManagerBase_104 {
public:
    /* 1C */ UnkStruct_ov019_020d24c8_28_258 mUnk_1C;
    /* 34 */ STRUCT_PAD(0x34, 0x50);
    /* 50 */

    AdventureModeManager_1B0(); // overlay 31
    void func_ov031_0210fad0();

    // data_ov031_02116358
    /* 00 */ virtual ~AdventureModeManager_1B0() override;
    /* 08 */ virtual void vfunc_08(Input *pButtons, TouchControl *pTouchControl) override;
    /* 10 */ virtual void vfunc_10(unk8 *param1) override;
};

struct AdventureModeManager_1B8_Base_1C {
    /* 00 */ unk16 mUnk_00;
    /* 02 */ s16 mUnk_02;
    /* 04 */ unk16 mUnk_04;
    /* 06 */ s16 mUnk_06;

    AdventureModeManager_1B8_Base_1C() {}
    AdventureModeManager_1B8_Base_1C(unk16 param1, unk16 param2, unk16 param3, unk16 param4) {
        this->mUnk_00 = param1;
        this->mUnk_02 = param2;
        this->mUnk_04 = param3;
        this->mUnk_06 = param4;
    }
};

#define ADVMGR_UNK -0x8000
class AdventureModeManager_1B8_Base {
public:
    /* 00 */ unk32 mUnk_00;
    /* 04 */ unk32 mUnk_04;
    /* 08 */ bool mUnk_08;
    /* 09 */ bool mUnk_09;
    /* 0A */ bool mUnk_0A;
    /* 0B */ u8 mUnk_0B;
    /* 0C */ u8 mUnk_0C;
    /* 0C */ bool mUnk_0D;
    /* 0E */ u8 mBGType;
    /* 0F */ bool mIsTopScreen;
    /* 10 */ bool mUnk_10;
    /* 11 */ unk8 mUnk_11; // pad?
    /* 12 */ unk8 mUnk_12; // pad?
    /* 13 */ unk8 mUnk_13; // pad?
    /* 14 */ s32 mUnk_14;
    /* 18 */ u8 *mUnk_18;
    /* 1C */ AdventureModeManager_1B8_Base_1C mUnk_1C;
    /* 24 */

    s32 GetUnkValue_ImplS(s32 val, bool cond) {
        if (cond) {
            return (val * 256) / 2;
        }

        return val * 256;
    }

    u32 GetUnkValue(u32 val) {
        if (this->mUnk_10) {
            return (val * 256) / 2;
        }

        return val * 256;
    }

    u32 GetUnkValue2() {
        if (this->mUnk_08) {
            return 0x2000;
        }

        return 0;
    }

    AdventureModeManager_1B8_Base(u8 bgType, bool param2, const AdventureModeManager_1B8_Base_1C &param3, bool param4,
                                  bool param5);
    ~AdventureModeManager_1B8_Base();

    void func_ov024_020d0698();
    void func_ov024_020d06d0();
    void func_ov024_020d072c(unk8 *param1);
    bool func_ov024_020d0744(s32 arg1, s32 arg2, s32 arg3, s32 arg4, u8 arg5, u8 arg6);
    bool func_ov024_020d0924(unk32 param1, unk32 param2, u8 param3, u8 param4);
    void func_ov024_020d0a64();
    void TryLoadBGChar(void *ptr, u32 offset, u32 size);
    unk32 func_ov024_020d0db4(unk32 param1, unk32 param2);
    bool func_ov024_020d0df8(unk32 param1, unk32 param2);
    void func_ov024_020d0e64(void *ptr, u32 size);
    bool func_ov024_020d0e98();
    static void func_ov024_020d0ec0(s32 *pFlags, s32 position, bool doSet);
    static bool func_ov024_020d0f0c(s32 *pFlags, s32 position);
    static unk32 func_ov024_020d0f2c(unk32 param1, unk32 param2);
};

class AdventureModeManager_1B8 : public AdventureModeManager_1B8_Base {
public:
    /* 00 (base) */
    /* 24 */ u16 mUnk_24;
    /* 24 */ unk16 mUnk_26; // pad?
    /* 24 */ void *mUnk_28;
    /* 2C */

    AdventureModeManager_1B8(u8 bgType, bool param2, bool param3); // overlay 24
    ~AdventureModeManager_1B8();

    void func_ov024_020d0fb4(unk32 param1, unk32 param2, u8 param3, u8 param4, TouchControl *param5);
    void func_ov024_020d114c();
    bool func_ov024_020d1160();
    void func_ov024_020d1364();
    void func_ov024_020d13cc(s32 param1);
    bool func_ov024_020d14a8(AdventureModeManager_1B8_Base_1C *param1, unk32 param2, s32 *pFlags);
    void func_ov024_020d1564(const AdventureModeManager_1B8_Base_1C *param1, unk32 param2, s32 *pFlags, const u8 param4);
    void func_ov024_020d1614(void *param1);
    void func_ov024_020d1638();
};

class AdventureModeManager_1BC : public AdventureModeManager_1B8_Base {
public:
    /* 00 (base) */
    /* 24 */ STRUCT_PAD(0x24, 0x34);
    /* 34 */ bool mUnk_34;
    /* 35 */ unk8 mUnk_35;
    /* 36 */ unk8 mUnk_36;
    /* 37 */ unk8 mUnk_37;
    /* 38 */

    AdventureModeManager_1BC(); // overlay 93
    ~AdventureModeManager_1BC();

    void func_ov093_02175514();
};

struct SceneInfos {
    /* 00 */ u32 sceneIndex; // scene index
    /* 04 */ u8 unk_04;
    /* 05 */ unk8 unk_05; // pad?
    /* 06 */ unk16 unk_06;
};

class AdventureModeManager : public TitleScreenManager_Base {
public:
    /* 000 (base) */
    /* 154 */ unk32 mUnk_154;
    /* 158 */ GameModeManagerBase_104 *mUnk_158;
    /* 15C */ AdventureModeManager_15C *mUnk_15C;
    /* 160 */ AdventureModeManager_160 *mUnk_160; // related to the minimap?
    /* 164 */ AdventureModeManager_164 *mUnk_164;
    /* 168 */ AdventureModeManager_168 *mUnk_168;
    /* 16C */ AdventureModeManager_16C *mUnk_16C;
    /* 170 */ AdventureModeManager_170 *mUnk_170; // related to game over?
    /* 174 */ AdventureModeManager_174 *mUnk_174; // related to the minimap?
    /* 178 */ AdventureModeManager_178 *mUnk_178; // related to factory ovl?
    /* 17C */ AdventureModeManager_17C *mUnk_17C;
    /* 180 */ AdventureModeManager_180 *mUnk_180; // related to stamps?
    /* 184 */ AdventureModeManager_184 *mUnk_184; // related to WDST actor?
    /* 188 */ AdventureModeManager_188 *mUnk_188;
    /* 18C */ AdventureModeManager_18C *mUnk_18C; // related to world map?
    /* 190 */ AdventureModeManager_190 *mUnk_190; // related to world map?
    /* 194 */ AdventureModeManager_194 *mUnk_194;
    /* 198 */ AdventureModeManager_198 *mUnk_198;
    /* 19C */ AdventureModeManager_19C *mUnk_19C;
    /* 1A0 */ AdventureModeManager_1A0 *mUnk_1A0;
    /* 1A4 */ AdventureModeManager_1A4 *mUnk_1A4;
    /* 1A8 */ AdventureModeManager_1A8 *mUnk_1A8;
    /* 1AC */ AdventureModeManager_1AC *mUnk_1AC;
    /* 1B0 */ AdventureModeManager_1B0 *mUnk_1B0;
    /* 1B4 */ bool mUnk_1B4;
    /* 1B4 */ bool mUnk_1B5;
    /* 1B4 */ unk8 mUnk_1B6; // pad?
    /* 1B4 */ unk8 mUnk_1B7; // pad?
    /* 1B8 */ AdventureModeManager_1B8 *mUnk_1B8;
    /* 1BC */ AdventureModeManager_1BC *mUnk_1BC;
    /* 1C0 */ bool mUnk_1C0;
    /* 1C1 */ bool mAllowMapPaint;
    /* 1C2 */ unk8 mUnk_1C2; // pad?
    /* 1C3 */ unk8 mUnk_1C3; // pad?
    /* 1C4 */ SceneInfos mUnk_1C4;
    /* 1C4 */ SceneInfos mUnk_1CC;
    /* 1D4 */

    AdventureModeManager(UnkStruct_0204a110_Sub2 *param1);

    // data_ov024_020d7c18 vtable
    /* 08 */ virtual ~AdventureModeManager() override;
    /* 10 */ virtual void vfunc_10(unk32 param1, unk32 param2, unk32 param3) override;
    /* 14 */ virtual void vfunc_14() override;
    /* 18 */ virtual void vfunc_18() override;
    /* 1C */ virtual void vfunc_1C() override;
    /* 20 */ virtual void vfunc_20() override;
    /* 24 */ virtual void vfunc_24() override;
    /* 28 */ virtual void vfunc_28(unk8 *param1) override;
    /* 2C */ virtual void DrawUI(unk8 *param1) override;
    /* 34 */ virtual void vfunc_34(unk32 param1, unk32 param2) override;
    /* 38 */ virtual void vfunc_38(u32 sceneIndex, u8 roomIndex, unk16 param3, unk16 param4) override;

    void func_ov001_020c08b8();

    void func_ov024_020c5288();
    void func_ov024_020c52a0();
    void func_ov024_020c52b8();
    void func_ov024_020c52f4();
    void func_ov024_020c530c();
    void func_ov024_020c5364();
    void func_ov024_020c537c();
    void func_ov024_020c53e8();
    void func_ov024_020c555c(unk32 param1);
    void func_ov024_020c5cec();
    bool func_ov024_020c5dac();
    bool func_ov024_020c5ecc();
    bool func_ov024_020c5f70();
    bool func_ov024_020c60f4();
    bool func_ov024_020c623c();
    void func_ov024_020c6514(SceneIndex sceneIndex, u8 param2, unk16 param3, unk16 param4);
    u8 GetMapPaintIndex(SceneIndex sceneIndex, u8 param2);
    void func_ov024_020c66c0();
    void func_ov024_020c671c();
    void func_ov024_020c6770(SceneIndex sceneIndex, u8 param2, unk16 param3, unk16 param4);
    bool func_ov024_020c681c();
    void func_ov024_020c6840(SceneIndex sceneIndex);
    void func_ov024_020c68d4(Vec2s *param1, unk32 param2);
    bool func_ov024_020c68ec(unk32 param1, unk32 param2);
    void func_ov024_020c6930();
    bool func_ov024_020c6940(unk32 param1, unk32 param2);
    unk32 func_ov024_020c69d0();
    unk32 func_ov024_020c6a20();
    void func_ov024_020c6a48(unk32 param1, bool param2);
    bool func_ov024_020c6af4(unk32 param1);
    void func_ov024_020c6b8c();
    void func_ov024_020c6c60();
    void func_ov024_020c6cd4();
    bool func_ov024_020c6ce4();
    AdventureModeManager_194_0C *func_ov024_020c6d04();
    void func_ov024_020c6d10();
    void func_ov024_020c6d20(unk32 param1);
    void func_ov024_020c6d2c(unk32 param1);
    bool func_ov024_020c6d64();
    void func_ov024_020c6db8(unk32 param1);
    bool func_ov024_020c6dec();
    void func_ov024_020c699c();

    static GameModeManagerBase *Create(UnkStruct_0204a110_Sub2 *param1);
    static void func_ov001_020c00d4();
    static void func_ov001_020c0104();
    static void func_ov001_020c0194();
    static void func_ov001_020c0824();
    static void func_ov001_020c083c();
    static void func_ov001_020c0854();
    static void func_ov001_020c0874();
    static void func_ov001_020c0894();
};

typedef struct UnkStruct_ov024_020d86a8 {
    union {
        struct {
            /* 00 */ u8 mUnk_00_0 : 1;
            /* 00 */ u8 mUnk_00_1 : 1;
        };
        u32 data;
    };
} UnkStruct_ov024_020d86a8;

extern const UnkStruct_ov024_020d86a8 data_ov024_020d78b8;

extern void SetCreditsEndingType(u16 value);
extern u16 GetCreditsEndingType();

extern void func_ov024_020d51dc(Vec2s *param1, SceneIndex sceneIndex);
extern void func_ov024_020d524c(Vec2s *param1, SceneIndex sceneIndex);
extern bool func_ov024_020d5304(SceneIndex sceneIndex);
extern bool func_ov024_020d5340(SceneIndex sceneIndex);
extern bool func_ov024_020d5354(s32 *pFlagPos, s16 *pFlagValue, ItemId itemId);
extern bool func_ov024_020d5410(SceneIndex sceneIndex);
extern bool func_ov024_020d5434(SceneIndex sceneIndex);
extern bool func_ov024_020d5458(SceneIndex sceneIndex);
extern bool func_ov024_020d547c(SceneIndex sceneIndex);
extern const u16 data_ov024_020d7684[5][6];

extern const int data_ov024_020d7318;
extern const int data_ov024_020d731c;
extern const int data_ov024_020d7320;
extern const int data_ov024_020d7324;
