#ifndef Z_DEMO_KANKYO_H
#define Z_DEMO_KANKYO_H

#include "ultra64.h"
#include "actor.h"

struct DemoKankyo;

typedef void (*DemoKankyoActionFunc)(struct DemoKankyo*, struct PlayState*);

typedef enum DemoKankyoType {
    /* 0x00 */ DEMOKANKYO_BLUE_RAIN,
    /* 0x01 */ DEMOKANKYO_BLUE_RAIN_2,
    /* 0x02 */ DEMOKANKYO_ROCK_1,
    /* 0x03 */ DEMOKANKYO_ROCK_2,
    /* 0x04 */ DEMOKANKYO_ROCK_3,
    /* 0x05 */ DEMOKANKYO_ROCK_4,
    /* 0x06 */ DEMOKANKYO_ROCK_5,
    /* 0x07 */ DEMOKANKYO_CLOUDS,
    /* 0x08 */ DEMOKANKYO_8,        // These unnamed types are removed types that would have used object_gi_melody
    /* 0x09 */ DEMOKANKYO_9,
    /* 0x0A */ DEMOKANKYO_A,
    /* 0x0B */ DEMOKANKYO_B,
    /* 0x0C */ DEMOKANKYO_C,
    /* 0x0D */ DEMOKANKYO_DOOR_OF_TIME,
    /* 0x0E */ DEMOKANKYO_LIGHT_PLANE,
    /* 0x0F */ DEMOKANKYO_WARP_OUT,
    /* 0x10 */ DEMOKANKYO_WARP_IN,
    /* 0x11 */ DEMOKANKYO_SPARKLES
} DemoKankyoType;

typedef struct DemoKankyoUnk150 {
    /* 0x00 */ Vec3f unk_0;
    /* 0x0C */ Vec3f unk_C;
    /* 0x18 */ f32 unk_18;     // For Door of Time, this is the amount to translate it by used for when it's opening
    /* 0x1C */ f32 unk_1C;
    /* 0x20 */ s16 unk_20;
    /* 0x22 */ u8 unk_22;      // mode ?
    /* 0x23 */ u8 unk_23;
    /* 0x24 */ s16 unk_24;
} DemoKankyoUnk150; // size = 0x28

typedef struct DemoKankyo {
    /* 0x0000 */ Actor actor;
    /* 0x014C */ u8 requiredObjectSlot;
    /* 0x014D */ u8 sparkleCounter;
    /* 0x014E */ u8 warpTimer;
    /* 0x0150 */ DemoKankyoUnk150 unk_150[30];
    /* 0x0600 */ DemoKankyoActionFunc actionFunc;
} DemoKankyo; // size = 0x0604

#endif
