Nimbin[12]?SDL & Graphics / mapcreator / commits / b22c054

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 collect vegetable BUT planting twice and remove soil?

Christian Immanuel · 2025-12-14 10:47 · b22c0549335dd5b67a3bd116129f62a8ea1f853b

 src/character/character.cpp   | 49 +++++++++++++++++++++++++++++++++----------
 src/character/character.hpp   |  1 +
 src/objects/object.cpp        |  1 -
 src/vegetables/vegetables.cpp | 30 ++++++++++++++++++++------
 src/vegetables/vegetables.hpp |  7 +++++--
 5 files changed, 68 insertions(+), 20 deletions(-)

diff --git a/src/character/character.cpp b/src/character/character.cpp
index a752dfb..85e4571 100644
--- a/src/character/character.cpp
+++ b/src/character/character.cpp
@@ -253,7 +253,7 @@ Character::Draw(SDL_Renderer* renderer) {
             0.0, nullptr,
             flip ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE);
     if (collecting_logic.is_collecting) {
-        float collecting_progress = collecting_logic.duration / collecting_logic.resource.collecting_duration;
+        float collecting_progress = collecting_logic.duration / collecting_logic.duration_max;
         size_t r = 6;
         draw_CircleProgress(renderer, Scale(Character::x + Character::tile_size/2), Scale(Character::y + Character::tile_size/6), Scale(r), collecting_progress);
     }
@@ -422,6 +422,11 @@ Character::find_ClosestObject(SDL_Point* tile_found, ObjectCategory category) {
                       || o->category == ObjectCategory::BUILDING) {
                     *tile_found = tile_point;
                     return &object;
+                } else
+                if (o->category == ObjectCategory::FARM_CROP) {
+                    Vegetable* veg = static_cast<Vegetable*>(o);
+                    if (veg->is_Collectable())
+                        return &object;
                 }
             }
         }
@@ -438,14 +443,26 @@ Character::collect_Start(TileObject* map_object_p, SDL_Point tile_point) {
     } else {
         //Tile::print_TileObject(*map_object_p);
         Object* object = Object::get_ObjectById(map_object_p->object_id);
+
         set_Status(CharacterStatus::COLLECT);
+        std::cout << "stat: " << (int)status << std::endl;
+
         collecting_logic.duration = 0;
         collecting_logic.object = map_object_p;
-        if (!map_object_p || object->category != ObjectCategory::RESOURCE) {
+        std::cout << "Item found!\n";
+        if (!map_object_p || (object->category != ObjectCategory::RESOURCE &&
+                             object->category != ObjectCategory::FARM_CROP)) {
+            std::cout << "Invalid object: " << (int)object->category << std::endl;
             collect_Stop();
+            return;
+        }
+        collecting_logic.duration_max = 3;
+        if (object->object_type != ObjectType::VEGETABLE) {
+            collecting_logic.resource = Tile::get_ResourceFromTileSet(object->tileset_id, object->tileset_object_id);
+            collecting_logic.duration_max = collecting_logic.resource.collecting_duration;
+        } else {
+            collecting_logic.duration_max = static_cast<Vegetable*>(object)->collecting_duration_max;
         }
-        std::cout << "Item found!\n";
-        collecting_logic.resource = Tile::get_ResourceFromTileSet(object->tileset_id, object->tileset_object_id);
         collecting_logic.is_collecting = true;
 
         float dx = (tile_point.x * Tile::tile_size + Tile::tile_size * 0.5f)
@@ -476,19 +493,26 @@ Character::collect_Start(TileObject* map_object_p, SDL_Point tile_point) {
 void
 Character::collect_Object() {
     collecting_logic.duration += Default::delta_time;
-    if (collecting_logic.duration >= collecting_logic.resource.collecting_duration) {
+    if (collecting_logic.duration >= collecting_logic.duration_max) {
         std::cout << "Collected item!\n";
         // Remove object from MapTileObject s
 
-        inventory->add_Resource(collecting_logic.resource.resource, static_cast<int>(collecting_logic.resource.quantity), messages.get());
+        Object* object = Object::get_ObjectById(collecting_logic.object->object_id);
+        if (object->object_type == ObjectType::VEGETABLE)
+            inventory->add_Vegetable(static_cast<Vegetable*>(object)->type, static_cast<Vegetable*>(object)->quantity, messages.get());
+        else
+            inventory->add_Resource(collecting_logic.resource.resource, static_cast<int>(collecting_logic.resource.quantity), messages.get());
         /*
         resources[collecting_logic.resource.resource] += collecting_logic.resource.quantity;
         */
         set_ResourceDiscovery(collecting_logic.resource.resource);
 
-        TileObject* to = collecting_logic.object;
-        Object::Remove(Object::get_ObjectById(to->object_id));
-
+        if (object->object_type == ObjectType::VEGETABLE) {
+            static_cast<Vegetable*>(object)->pick_Up();
+        } else {
+            TileObject* to = collecting_logic.object;
+            Object::Remove(Object::get_ObjectById(to->object_id));
+        }
         collect_Stop();
     }
 }
@@ -845,7 +869,7 @@ 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);
+        Vegetable* v = new Vegetable(crop_def, planting_logic.type, 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;
@@ -1270,7 +1294,9 @@ Character::handle_Input(Input& input, SDL_Rect win_size) {
         Object* object = Object::get_ObjectById(map_object_p->object_id);
         switch (object->category) {
             case ObjectCategory::RESOURCE:
+            case ObjectCategory::FARM_CROP:
                 collect_Start(map_object_p, tile_point);
+                std::cout << "STAT: " << (int)status << std::endl;
                 break;
             case ObjectCategory::BUILDING:
                 interact_WithBuilding(static_cast<Building*>(object));
@@ -1461,8 +1487,9 @@ void Character::handle_Move() {
     }
 
 
-    if (collecting_logic.is_collecting)
+    if (collecting_logic.is_collecting) {
         collect_Stop();
+    }
     if (consuming_logic.is_consuming)
         drink_Stop();
 
diff --git a/src/character/character.hpp b/src/character/character.hpp
index be6c4c6..38dd7f9 100644
--- a/src/character/character.hpp
+++ b/src/character/character.hpp
@@ -47,6 +47,7 @@ struct CharacterMoveLogic {
 
 struct CharacterCollectingLogic {
     float duration;
+    float duration_max;
     TileObject* object;
     Resource_s resource;
     bool is_collecting;
diff --git a/src/objects/object.cpp b/src/objects/object.cpp
index 4794381..a0cbcb4 100644
--- a/src/objects/object.cpp
+++ b/src/objects/object.cpp
@@ -272,6 +272,5 @@ Object::Remove(Object* obj) {
         }
     }
 
-    objects.erase( std::remove_if(objects.begin(), objects.end(), [obj](Object* o) { return o->id == obj->id; }), objects.end());
     delete obj;
 }
diff --git a/src/vegetables/vegetables.cpp b/src/vegetables/vegetables.cpp
index 080ead2..2a8a7cd 100644
--- a/src/vegetables/vegetables.cpp
+++ b/src/vegetables/vegetables.cpp
@@ -7,6 +7,7 @@ namespace VegetableData {
     std::vector<Vegetable*> all_vegetables;
 
     const CropDefinition crop_defs[(int)Type::COUNT] = {
+        //        STAGE: 0    1    2    3    4
         { "",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},
         { "raddish",     2,3, 5,3, 6,3, 7,3, 23,1, (5-2+1)+1},
@@ -26,7 +27,7 @@ namespace VegetableData {
     }
 }
 
-Vegetable::Vegetable(const VegetableData::CropDefinition* cd,
+Vegetable::Vegetable(const VegetableData::CropDefinition* cd, VegetableData::Type t,
                      SDL_Point world_pos)
     :
     Object(ObjectType::VEGETABLE,
@@ -37,15 +38,18 @@ Vegetable::Vegetable(const VegetableData::CropDefinition* cd,
            world_pos,
            {1,1},
            0),
+    type(t),
     definition(cd),
     growth_stage(0),
-    last_update_sec(Default::get_TimeSinceStartInSec()),
+    next_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);
 
+    collecting_duration_max = 3.2;
+
 
     objects.push_back(this);
     update_TilesetId();
@@ -72,11 +76,12 @@ Vegetable::get_SetPosition() {
 
 
 static constexpr double SECONDS_PER_STAGE = 5.0;
+
 void Vegetable::Grow(double current_seconds) {
-    if (current_seconds <= last_update_sec)
+    if (current_seconds <= next_update_sec)
         return;
 
-    double delta_sec = current_seconds - last_update_sec;
+    double delta_sec = current_seconds - next_update_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;
@@ -84,7 +89,13 @@ void Vegetable::Grow(double current_seconds) {
     if (delta_stages == 0)
         return;
 
-    last_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE;
+
+    // MULTIPLY LAST STAGE
+    int grow_multiplier = 3;
+    if (growth_stage == (definition->total_stages - 3))
+        next_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE*grow_multiplier;
+    else
+        next_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE;
 
     growth_stage += delta_stages;
     if (growth_stage >= definition->total_stages)
@@ -103,7 +114,14 @@ bool Vegetable::is_FullyGrown() const {
 
 void Vegetable::pick_Up() {
     // mark as removed → caller inserts into inventory
-    delete this;
+    for (auto it = VegetableData::all_vegetables.begin(); it != VegetableData::all_vegetables.end(); ++it) {
+        if (*it == this) {
+            VegetableData::all_vegetables.erase(it);
+            break;
+        }
+    }
+
+    Object::Remove(Object::get_ObjectById(id));
 }
 
 bool Vegetable::is_Collectable() const {
diff --git a/src/vegetables/vegetables.hpp b/src/vegetables/vegetables.hpp
index 3e2ba2e..982291d 100644
--- a/src/vegetables/vegetables.hpp
+++ b/src/vegetables/vegetables.hpp
@@ -52,16 +52,19 @@ namespace VegetableData {
 
 class Vegetable : public Object, public IsCollectable {
 public:
+    VegetableData::Type type;
     const  VegetableData::CropDefinition* definition;
+    size_t quantity = 2;
     size_t growth_stage;       // 0 = planted, last = rotten
-    double last_update_sec;    // seconds since game start
+    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(const VegetableData::CropDefinition* cd,
+    Vegetable(const VegetableData::CropDefinition* cd, VegetableData::Type t,
               SDL_Point world_pos);
 
     SDL_Point get_SetPosition() override;