#pragma once #include "objects/object.hpp" class Inventory; class Messages; enum class ItemType : uint32_t ; enum class EquipmentSlot; class Vegetable; struct ConsumingStatsBonus { float health = 0.0f; float stamina = 0.0f; float thirst = 0.0f; float demage = 0.0f; float duration = 0.0f; }; namespace VegetableData { extern std::vector all_vegetables; enum class Type : uint32_t { NONE, CARROT, RADDISH, CABBAGE, SALAD, CAULIFLOWER, ONION, COUNT }; struct CropDefinition { const char* name; int start_tile_x; int start_tile_y; int grown_tile_x; // last stage before rotten int grown_tile_y; int rotten_tile_x; int rotten_tile_y; int collectable_tile_x; int collectable_tile_y; int icon_tile_x; int icon_tile_y; size_t total_stages; // auto-calculated = (grown-start)+1 + rotten bool is_seed; ConsumingStatsBonus stats_bonus; }; extern const CropDefinition crop_defs[(int)Type::COUNT]; const CropDefinition* get_DataByType(Type type); const SDL_Point get_IconTilePosByType(Type type, bool is_seed = false); } class Vegetable : public Object, public IsCollectable { public: VegetableData::Type type; const VegetableData::CropDefinition* definition; size_t quantity = 2; bool is_seed = false; size_t growth_stage; // 0 = planted, last = rotten double next_update_sec; // seconds since game start float collecting_duration_max; int tileset_object_x = 0; int tileset_object_y = 0; EquipmentSlot equipement_slot; Vegetable(VegetableData::Type t, SDL_Point world_pos, bool is_s); SDL_Point get_SetPosition() override; const VegetableData::CropDefinition& get_DataByType(); void Grow(double current_seconds); bool is_Rotten() const; bool is_FullyGrown() const; void pick_Up(); // ICollectable bool is_Collectable() const override; void Collect(Inventory*, Messages*) override; private: void update_TilesetId(); };