mapcreator git · master
SDL3 2.5D game and engine using assets, with map editor
C++ 99.3%git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gzAdd vegetable discovery AND fix top right message size
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();