#ifndef D_A_GRASS_H
#define D_A_GRASS_H

#include "f_op/f_op_actor_mng.h"

class cCcD_Obj;
class dCcMassS_HitInf;
class dFlower_packet_c;
class dGrass_packet_c;

/**
 * @ingroup actors-unsorted
 * @class daGrass_c
 * @brief Grass
 *
 * @details
 *
 */
class daGrass_c : public fopAc_ac_c {
public:
    bool createGrass();
    void deleteGrass();
    void executeGrass();
    void drawGrass();
    void newGrassData(cXyz&, int, u8, u8, s16, u8);
    bool createFlower();
    void deleteFlower();
    void executeFlower();
    void drawFlower();
    void newFlowerData(s8, cXyz&, int, s8, s16);

    inline int create();

    inline int Delete();
    inline int execute();
    inline int draw();

    static dGrass_packet_c* getGrass() { return m_grass; }
    static dFlower_packet_c* getFlower() { return m_flower; }

    static void deleteRoomGrass(int);
    static void deleteRoomFlower(int);

    static DUSK_GAME_DATA daGrass_c* m_myObj;
    static DUSK_GAME_DATA dGrass_packet_c* m_grass;
    static DUSK_GAME_DATA dFlower_packet_c* m_flower;

    /* 0x568 */ u8 unk_0x568[0x570 - 0x568];
};

namespace daGrass_prm {
    inline u8 getKind(daGrass_c* i_this) { return (fopAcM_GetParam(i_this) >> 4) & 3; }
    inline u8 getType(daGrass_c* i_this) { return fopAcM_GetParam(i_this) & 0xF; }
    inline u8 getItemNo(daGrass_c* i_this) { return (fopAcM_GetParam(i_this) >> 0x10) & 0xFF; }
    inline u8 getItemBitNo(daGrass_c* i_this) { return (fopAcM_GetParam(i_this) >> 8) & 0xFF; }
};

struct daGrass_offsetData {
    /* 0x0 */ u8 num;
    /* 0x4 */ csXyz* set_type;
};


#endif /* D_A_GRASS_H */
