Nimbin[12]?SDL & Graphics / mapcreator / commits / 8a0378d

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 vegetable discovery AND fix top right message size

Christian Immanuel · 2026-02-17 14:50 · 8a0378d8cba254567b5e1de52023c0514c81b03a

 src/character/character.cpp | 31 ++++++++++++++++++++++++++-----
 src/character/character.hpp |  3 +++
 src/character/message.cpp   |  9 +++++----
 src/character/message.hpp   |  1 +
 src/game/game.cpp           |  3 ++-
 5 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/src/character/character.cpp b/src/character/character.cpp
index 57a0098..16ee25e 100644
--- a/src/character/character.cpp
+++ b/src/character/character.cpp
@@ -19,6 +19,7 @@ Character::Character()
     : messages(std::make_unique<Messages>()),
       inventory(std::make_unique<Inventory>()),
       discovered_resources(static_cast<size_t>(ResourceType::LAST), false),
+      discovered_vegetables(static_cast<size_t>(VegetableData::Type::COUNT), false),
       discovered_buildings(static_cast<size_t>(BuildingType::LAST), false),
       researched_buildings(static_cast<size_t>(BuildingType::LAST), false),
       researched_items    (static_cast<size_t>(ItemType::LAST),     false) {
@@ -544,19 +545,22 @@ Character::collect_Object() {
         Object* object = Object::get_ObjectById(collecting_logic.object->object_id);
         if (object->object_type == ObjectType::VEGETABLE) {
             Vegetable* v = static_cast<Vegetable*>(object);
-            std::cout << "ISSEED " << v->is_seed << std::endl;
             if (v->is_Rotten()) {
                 inventory->add_Seed(v->type, inventory->get_Seed(v->type) == 0 ? 1 : (rand() % 3 == 1 ? 1 : 0), messages.get());
             } else if (v->is_seed)
                 inventory->add_Seed(v->type, v->quantity, messages.get());
             else
                 inventory->add_Vegetable(v->type, v->quantity, messages.get());
-        } else
+
+            set_VegetableDiscovery(v->type);
+
+        } else {
             inventory->add_Resource(collecting_logic.resource.resource, static_cast<int>(collecting_logic.resource.quantity), messages.get());
+            set_ResourceDiscovery(collecting_logic.resource.resource);
+        }
         /*
         resources[collecting_logic.resource.resource] += collecting_logic.resource.quantity;
         */
-        set_ResourceDiscovery(collecting_logic.resource.resource);
 
         if (object->object_type == ObjectType::VEGETABLE) {
             static_cast<Vegetable*>(object)->pick_Up();
@@ -2204,6 +2208,19 @@ Character::set_ResourceDiscovery(ResourceType resource) {
 }
 
 
+void
+Character::set_VegetableDiscovery(VegetableData::Type vegetable) {
+    size_t id = static_cast<size_t>(vegetable);
+
+    if (discovered_vegetables[id])
+        return;
+    
+    discovered_vegetables[id] = true;
+    messages->Add(MessageKey::DISCOVERED_VEGETABLE);
+    set_BuildingDiscovery();
+}
+
+
 void
 Character::set_BuildingDiscovery() {
     for (BuildingData_s bs : BuildingData::building_data) {
@@ -2256,8 +2273,8 @@ Character::Save(const std::string &path) const {
     }
 
     file.write(reinterpret_cast<const char*>(&stats), sizeof(stats));
-    file.write(reinterpret_cast<const char*>(&x), sizeof(x));
-    file.write(reinterpret_cast<const char*>(&y), sizeof(y));
+    file.write(reinterpret_cast<const char*>(&x),     sizeof(x));
+    file.write(reinterpret_cast<const char*>(&y),     sizeof(y));
     file.write(reinterpret_cast<const char*>(&level), sizeof(level));
 
 
@@ -2286,6 +2303,10 @@ Character::Load(const std::string &path) {
 
     for (auto rs : inventory->resources)
         set_ResourceDiscovery(rs.first);
+    for (auto vs : inventory->vegetables)
+        set_VegetableDiscovery(vs.first);
+    for (auto vs : inventory->seeds)
+        set_VegetableDiscovery(vs.first);
     set_BuildingDiscovery();
 
     return file.good();
diff --git a/src/character/character.hpp b/src/character/character.hpp
index 6842fbd..73b9915 100644
--- a/src/character/character.hpp
+++ b/src/character/character.hpp
@@ -221,6 +221,7 @@ class Character {
     std::unique_ptr<Inventory> inventory;
 
     std::vector<bool>discovered_resources;
+    std::vector<bool>discovered_vegetables;
     std::vector<bool>discovered_buildings;
     std::vector<bool>researched_buildings;
 
@@ -326,6 +327,8 @@ class Character {
     void
     set_ResourceDiscovery(ResourceType resource);
     void
+    set_VegetableDiscovery(VegetableData::Type vegetable);
+    void
     set_BuildingDiscovery();
 
 
diff --git a/src/character/message.cpp b/src/character/message.cpp
index 66f09ec..baf5e66 100644
--- a/src/character/message.cpp
+++ b/src/character/message.cpp
@@ -15,7 +15,8 @@ Messages::Messages() {
         {MessageKey::MOIN, {10, MessageType::CHARACTER, "I should collect some things.."}},
         {MessageKey::BUILDING_TOOL_REQUIRED, {5, MessageType::CHARACTER, "I need a building tool!"}},
         {MessageKey::PLAYER_EXHAUSTED,       {5, MessageType::CHARACTER, "I am exhausted..."}},
-        {MessageKey::DISCOVERED_RESOURCE,    {5, MessageType::CHARACTER, "Wow, thats new!!"}},
+        {MessageKey::DISCOVERED_RESOURCE,    {5, MessageType::CHARACTER, "A new resource!"}},
+        {MessageKey::DISCOVERED_VEGETABLE,   {5, MessageType::CHARACTER, "A new vegetable!"}},
         {MessageKey::DISCOVERED_BUILDING,    {5, MessageType::CHARACTER, "Maybe i can build something with it.."}},
         {MessageKey::THIRST_20,     {10, MessageType::CHARACTER, "I should drink something.."}},
         {MessageKey::THIRST_0,      {10, MessageType::CHARACTER, "No water no life.."}},
@@ -194,8 +195,8 @@ void Messages::render_InventoryMessages(Game* game, Inventory* inventory) {
         return;
 
     const float bar_padding     = 6.0f;
-    const float bar_height_min  = 32.0f;
-    const float icon_bg_size    = 32.0f;
+    const float bar_height_min  = 48.0f;
+    const float icon_bg_size    = 48.0f;
     const float right_margin    = 10.0f;
     const float spacing         = 6.0f;
 
@@ -337,7 +338,7 @@ void Messages::render_InventoryMessages(Game* game, Inventory* inventory) {
         // Text
         SDL_FRect dst_text{
             bar_x + bar_padding,
-            y + bar_padding,
+            bar_height_min/2 + bar_padding - text_h/3,
             text_w,
             text_h
         };
diff --git a/src/character/message.hpp b/src/character/message.hpp
index 4ab2601..f93752f 100644
--- a/src/character/message.hpp
+++ b/src/character/message.hpp
@@ -29,6 +29,7 @@ enum class MessageKey {
     BUILDING_TOOL_REQUIRED,
     PLAYER_EXHAUSTED,
     DISCOVERED_RESOURCE,
+    DISCOVERED_VEGETABLE,
     DISCOVERED_BUILDING,
     THIRST_20,
     THIRST_0,
diff --git a/src/game/game.cpp b/src/game/game.cpp
index 1c78479..eebb5ce 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -206,8 +206,9 @@ void Game::Run() {
     while (running) {
         Default::set_DeltaTime();
         handle_Events();
-        if (state_changed)
+        if (state_changed) {
             continue;
+        }
         //std::cout << "IC " << (int)this->input.click_left << std::endl;
         Update();
         Render();