Nimbin[12]?SDL & Graphics / mapcreator / commits / 5a2dc74

mapcreator git · master

SDL3 2.5D game and engine using assets, with map editor

sdl3 c++ game engine map-editor cmake · first commit 2025-10-31 · last commit 2026-09-07 (1 month ago) · synced 3 days ago · upstream: git.ide3.de/hsnr/sdl-spieleentwicklung/map_creator

C++ 99.3%
git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gz

Add plant can grow

Christian Immanuel · 2025-12-12 08:09 · 5a2dc744ee46f52caab14de700b4628f72fb1b78

 src/character/character.cpp   |  5 +++-
 src/defaults/defaults.hpp     |  2 +-
 src/game/state_playing.cpp    |  5 ++++
 src/objects/object.cpp        | 12 ++++++--
 src/vegetables/vegetables.cpp | 66 +++++++++++++++++++++++++------------------
 src/vegetables/vegetables.hpp |  9 ++++++
 6 files changed, 68 insertions(+), 31 deletions(-)

diff --git a/src/character/character.cpp b/src/character/character.cpp
index 158f4b4..8e781a2 100644
--- a/src/character/character.cpp
+++ b/src/character/character.cpp
@@ -817,7 +817,8 @@ Character::plant_Start() {
     set_Status(CharacterStatus::PLANTING);
     handle_Animation();
     planting_logic.is_planting = true;
-    planting_logic.tile_world = tile_world;
+    planting_logic.tile_world  = tile_world;
+    planting_logic.type        = static_cast<InventoryVegetable*>(selected_item)->type;
 }
 
 void
@@ -837,9 +838,11 @@ Character::plant_Vegetable() {
 
     if (planting_logic.duration >= planting_logic.duration_max) {
         const VegetableData::CropDefinition* crop_def = VegetableData::get_DataByType(planting_logic.type);
+        std::cout << "DEF " << (int)planting_logic.type << " " << crop_def->name << std::endl;
         Vegetable* v = new Vegetable(crop_def, planting_logic.tile_world);
         TileObject to = {{0,0}, true, v->id};
         size_t id = Map::get_IdFromTilePoint(planting_logic.tile_world);
+        std::cout << "  " << id << std::endl;
         Map::tile_map[id].objects.push_back(to);
 
         plant_Stop();
diff --git a/src/defaults/defaults.hpp b/src/defaults/defaults.hpp
index d39388f..b10631a 100644
--- a/src/defaults/defaults.hpp
+++ b/src/defaults/defaults.hpp
@@ -42,7 +42,7 @@ namespace Default {
 
     extern SDL_Color menu_hovering_color;
 
-    void set_DeltaTime();
+    void   set_DeltaTime();
 
     double get_TimeSinceStartInSec();
 
diff --git a/src/game/state_playing.cpp b/src/game/state_playing.cpp
index d0aed1d..eb7a3b2 100644
--- a/src/game/state_playing.cpp
+++ b/src/game/state_playing.cpp
@@ -142,6 +142,11 @@ void StatePlaying::Update(Game* game) {
     // SET Map offset
     Map::set_Offset(game->input);
 
+    // VEGETABLES
+    for (Vegetable* veg : VegetableData::all_vegetables) {
+        veg->Grow(Default::get_TimeSinceStartInSec());
+    }
+
     // CHARACTER
     player->handle_Input(game->input, game->win_size);
     player->handle_Move();
diff --git a/src/objects/object.cpp b/src/objects/object.cpp
index 94edfdb..4794381 100644
--- a/src/objects/object.cpp
+++ b/src/objects/object.cpp
@@ -188,7 +188,7 @@ Object::print_CollisionMap() {
 void
 Object::Draw(SDL_Renderer* renderer, SDL_FPoint position, bool is_transparent, int transparency) {
     SDL_Point obj_set_pos = get_SetPosition();
-    SDL_FRect obj_src = {
+    SDL_FRect obj_src {
         static_cast<float>(obj_set_pos.x) * static_cast<float>(Tile::tile_size),
         static_cast<float>(obj_set_pos.y) * static_cast<float>(Tile::tile_size),
         static_cast<float>(dimension.x * static_cast<int>(Tile::tile_size)),
@@ -196,10 +196,18 @@ Object::Draw(SDL_Renderer* renderer, SDL_FPoint position, bool is_transparent, i
     };
 
     int size = Tile::get_Size();
-    SDL_FRect dst = { Scale(position.x + Map::offset.x),
+    SDL_FRect dst;
+    if (object_type == ObjectType::VEGETABLE) {
+        dst = { Scale(position.x + Map::offset.x),
+                      Scale(position.y + Map::offset.y-7),
+                      Scale(dimension.x * size),
+                      Scale(dimension.y * size) };
+    } else {
+        dst = { Scale(position.x + Map::offset.x),
                       Scale(position.y + Map::offset.y),
                       Scale(dimension.x * size),
                       Scale(dimension.y * size) };
+    }
 
 
     SDL_Texture* tex = Tile::tilesets[tileset_type][tileset_id].texture;
diff --git a/src/vegetables/vegetables.cpp b/src/vegetables/vegetables.cpp
index 8328349..080ead2 100644
--- a/src/vegetables/vegetables.cpp
+++ b/src/vegetables/vegetables.cpp
@@ -4,6 +4,8 @@
 
 
 namespace VegetableData {
+    std::vector<Vegetable*> all_vegetables;
+
     const CropDefinition crop_defs[(int)Type::COUNT] = {
         { "",0,0,0,0,0,0,0,0,0,0,0 },
         { "carrot",      2,1, 5,1, 6,1, 7,1, 23,0, (5-2+1)+1},
@@ -37,9 +39,14 @@ Vegetable::Vegetable(const VegetableData::CropDefinition* cd,
            0),
     definition(cd),
     growth_stage(0),
-    last_update_sec(0.0),
+    last_update_sec(Default::get_TimeSinceStartInSec()),
     equipement_slot(EquipmentSlot::HAND_RIGHT)
 {
+    tileset_object_x = definition->start_tile_x;
+    tileset_object_y = definition->start_tile_y;
+    VegetableData::all_vegetables.push_back(this);
+
+
     objects.push_back(this);
     update_TilesetId();
 }
@@ -60,28 +67,30 @@ Vegetable::get_DataByType() {
 
 SDL_Point
 Vegetable::get_SetPosition() {
-        const VegetableData::CropDefinition& data = get_DataByType();
-        return {data.icon_tile_x, data.icon_tile_y};
+    return { tileset_object_x, tileset_object_y };
 }
 
+
+static constexpr double SECONDS_PER_STAGE = 5.0;
 void Vegetable::Grow(double current_seconds) {
     if (current_seconds <= last_update_sec)
         return;
 
     double delta_sec = current_seconds - last_update_sec;
-    last_update_sec = current_seconds;
 
-    // each second = 1 stage
-    size_t delta_stages = static_cast<size_t>(delta_sec);
+    size_t delta_stages = static_cast<size_t>(delta_sec / SECONDS_PER_STAGE);
+    //std::cout << "GROW " << delta_stages << " " << delta_sec << " " << SECONDS_PER_STAGE << std::endl;
+
+    if (delta_stages == 0)
+        return;
 
-    if (delta_stages > 0) {
-        growth_stage += delta_stages;
+    last_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE;
 
-        if (growth_stage >= definition->total_stages)
-            growth_stage = definition->total_stages - 1;
+    growth_stage += delta_stages;
+    if (growth_stage >= definition->total_stages)
+        growth_stage = definition->total_stages - 1;
 
-        update_TilesetId();
-    }
+    update_TilesetId();
 }
 
 bool Vegetable::is_Rotten() const {
@@ -114,21 +123,24 @@ void Vegetable::Collect(Inventory*, Messages*) {
 
 
 
-
 void Vegetable::update_TilesetId() {
-    // stage mapping
-    int sx = definition->start_tile_x;
-    int sy = definition->start_tile_y;
-
-    int grown_start = 0;
-    int grown_end = (definition->grown_tile_x - definition->start_tile_x);
-
-    if (growth_stage <= grown_end) {
-        tileset_object_id = sx + growth_stage; // linear x progression
-    } else if (growth_stage == definition->total_stages - 1) {
-        tileset_object_id = definition->rotten_tile_x;
-    } else {
-        tileset_object_id = definition->grown_tile_x;
+    const auto& d = *definition;
+
+    int grown_end = d.grown_tile_x - d.start_tile_x;
+
+    if (growth_stage <= static_cast<size_t>(grown_end)) {
+        // Regular growth stages, all on the start row
+        tileset_object_x = static_cast<size_t>(d.start_tile_x) + growth_stage;
+        tileset_object_y = d.start_tile_y;
+    }
+    else if (growth_stage == d.total_stages - 1) {
+        // Rotten stage
+        tileset_object_x = d.rotten_tile_x;
+        tileset_object_y = d.rotten_tile_y;
+    }
+    else {
+        // Fully grown but not rotten
+        tileset_object_x = d.grown_tile_x;
+        tileset_object_y = d.grown_tile_y;
     }
 }
-
diff --git a/src/vegetables/vegetables.hpp b/src/vegetables/vegetables.hpp
index 168f8da..3e2ba2e 100644
--- a/src/vegetables/vegetables.hpp
+++ b/src/vegetables/vegetables.hpp
@@ -8,7 +8,11 @@ class Messages;
 enum class ItemType;
 enum class EquipmentSlot;
 
+class Vegetable;
+
 namespace VegetableData {
+    extern std::vector<Vegetable*> all_vegetables;
+
     enum class Type {
         NONE,
         CARROT,
@@ -40,6 +44,8 @@ namespace VegetableData {
 
     const CropDefinition* get_DataByType(Type type);
     const SDL_Point get_IconTilePosByType(Type type);
+
+
 }
 
 
@@ -50,6 +56,9 @@ public:
     size_t growth_stage;       // 0 = planted, last = rotten
     double last_update_sec;    // seconds since game start
 
+    int tileset_object_x = 0;
+    int tileset_object_y = 0;
+
     EquipmentSlot equipement_slot;
 
     Vegetable(const VegetableData::CropDefinition* cd,