diff --git a/assets/prehistoric_house/Faerberhaus.jpg b/assets/prehistoric_house/Faerberhaus.jpg new file mode 100644 index 0000000..f8bccbb Binary files /dev/null and b/assets/prehistoric_house/Faerberhaus.jpg differ diff --git a/assets/prehistoric_house/Faerberhaus1.jpg b/assets/prehistoric_house/Faerberhaus1.jpg new file mode 100644 index 0000000..e700ef9 Binary files /dev/null and b/assets/prehistoric_house/Faerberhaus1.jpg differ diff --git a/assets/prehistoric_house/Faerberhaus1.png b/assets/prehistoric_house/Faerberhaus1.png new file mode 100644 index 0000000..d63a808 Binary files /dev/null and b/assets/prehistoric_house/Faerberhaus1.png differ diff --git a/assets/prehistoric_house/stone_mason.mtl b/assets/prehistoric_house/stone_mason.mtl new file mode 100644 index 0000000..0b37c59 --- /dev/null +++ b/assets/prehistoric_house/stone_mason.mtl @@ -0,0 +1,12 @@ +# Blender 5.0.1 MTL File: 'None' +# www.blender.org + +newmtl _Faerberhaus_FaerberhausFaerberhaus +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.500000 +d 1.000000 +illum 1 +map_Kd /home/sebastian/Downloads/prehistoric-house-asparn/source/Asparn_Weberhaus3/Faerberhaus.jpg diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index 74d9d9e..0a652d0 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -54,8 +54,15 @@ void GameLayer::onAttach() auto cabinModel = AssetManager::loadModel("cabin", "assets/cabin/cabin.obj", "assets/cabin/cabin.jpg", loader); - + auto stoneMasonModel = AssetManager::loadModel("stoneMason", "assets/prehistoric_house/stone_mason.obj", "assets/prehistoric_house/Faerberhaus.jpg", loader); //entities.push_back(std::make_shared(Entity(cabinModel, glm::vec3(0,0,0), 0,0,0, 1.f))); + + /*auto transformComponent = std::make_shared(glm::vec3(0,0,0), glm::vec3(0), 1.f); + auto modelComponent = std::make_shared(stoneMasonModel); + + EntityID entityID = entityManager->createEntity(); + entityManager->addComponent(entityID, transformComponent); + entityManager->addComponent(entityID, modelComponent);*/ } void GameLayer::onDetach() @@ -74,6 +81,12 @@ void GameLayer::onUpdate() if (InputManager::isKeyPressed(GLFW_KEY_A)) moveDir.x -= 1.0f; if (InputManager::isKeyPressed(GLFW_KEY_D)) moveDir.x += 1.0f; + if (InputManager::isKeyPressed(GLFW_KEY_1)) { + gameMode->setActiveBuilding(BuildingType::FOREST_HUT); + } else if (InputManager::isKeyPressed(GLFW_KEY_2)) { + gameMode->setActiveBuilding(BuildingType::STONE_MASON); + } + camera->move(moveDir, 0.5f); tileHighlightSystem->update(*entityManager, *mousePicker, *camera); diff --git a/src/game/GameMode.cpp b/src/game/GameMode.cpp index cb9f25f..ab3e2ce 100644 --- a/src/game/GameMode.cpp +++ b/src/game/GameMode.cpp @@ -54,4 +54,16 @@ void GameMode::pay(PlayerID playerID, const std::unordered_map GameMode::getActiveBuilding() const { + return activeBuilding; +} + +void GameMode::clearActiveBuilding() { + activeBuilding = std::nullopt; +} + +void GameMode::setActiveBuilding(BuildingType buildingType) { + activeBuilding = buildingType; +} + diff --git a/src/game/GameMode.h b/src/game/GameMode.h index ff3c6e0..3f84ba7 100644 --- a/src/game/GameMode.h +++ b/src/game/GameMode.h @@ -4,6 +4,8 @@ #ifndef GAMEMODE_H #define GAMEMODE_H +#include + #include "../engine/core/ECS/EntityManager.h" #include "hexWorld/ecs/components/BuildingComponent.h" #include "player/Player.h" @@ -24,10 +26,12 @@ public: PlayerInventory& getPlayerInventory(PlayerID playerID); void pay(PlayerID uint32, const std::unordered_map & pairs); - + std::optional getActiveBuilding() const; + void clearActiveBuilding(); + void setActiveBuilding(BuildingType buildingType); private: std::unordered_map players; - + std::optional activeBuilding; }; diff --git a/src/game/hexWorld/building/BuildingConfig.cpp b/src/game/hexWorld/building/BuildingConfig.cpp index 772d225..69a7229 100644 --- a/src/game/hexWorld/building/BuildingConfig.cpp +++ b/src/game/hexWorld/building/BuildingConfig.cpp @@ -8,8 +8,11 @@ const BuildingDefinition & BuildingConfig::get(BuildingType type) { if (type == BuildingType::FOREST_HUT) { - static const BuildingDefinition def = TemporaryBuildingDefinitionFactory::createForestHutDefinition(); - return def; + static const BuildingDefinition forest_hut_def = TemporaryBuildingDefinitionFactory::createForestHutDefinition(); + return forest_hut_def; + } else if (type == BuildingType::STONE_MASON) { + static const BuildingDefinition stone_mason_def = TemporaryBuildingDefinitionFactory::createStoneMasonDefinition(); + return stone_mason_def; } std::__throw_runtime_error("Unknown BuildingType"); } diff --git a/src/game/hexWorld/building/BuildingFactory.cpp b/src/game/hexWorld/building/BuildingFactory.cpp index 83808b1..0ccb66f 100644 --- a/src/game/hexWorld/building/BuildingFactory.cpp +++ b/src/game/hexWorld/building/BuildingFactory.cpp @@ -15,9 +15,17 @@ EntityID BuildingFactory::create(EntityManager &em, const BuildingDefinition &de em.addComponent(e, std::make_shared(AssetManager::getModel(def.model))); - em.addComponent(e, std::make_shared( - tileTransform.position, glm::vec3(0), 1.f - )); + if (def.type == BuildingType::FOREST_HUT) { + em.addComponent(e, std::make_shared( + tileTransform.position, glm::vec3(0), 1.f + )); + } else { + em.addComponent(e, std::make_shared( + tileTransform.position, glm::vec3(0), 2.f + )); + } + + em.addComponent(e, std::make_shared(def.type, tileEntity)); diff --git a/src/game/hexWorld/building/TemporaryBuildingDefinitionFactory.h b/src/game/hexWorld/building/TemporaryBuildingDefinitionFactory.h index 34d0195..9195ee2 100644 --- a/src/game/hexWorld/building/TemporaryBuildingDefinitionFactory.h +++ b/src/game/hexWorld/building/TemporaryBuildingDefinitionFactory.h @@ -18,6 +18,19 @@ namespace TemporaryBuildingDefinitionFactory { "cabin" }; } + + static inline BuildingDefinition createStoneMasonDefinition() { + auto allowedTileResources = std::vector{RessourceType::STONE}; + auto resourceCosts = std::unordered_map{}; + resourceCosts[RessourceType::WOOD] = 15; + resourceCosts[RessourceType::STONE] = 10; + return { + BuildingType::FOREST_HUT, + allowedTileResources, + resourceCosts, + "stoneMason" + }; + } } #endif //DICEWARS_SIEDLER_TEMPORARYBUILDINGDEFINITIONFACTORY_H \ No newline at end of file diff --git a/src/game/hexWorld/ecs/components/BuildingComponent.h b/src/game/hexWorld/ecs/components/BuildingComponent.h index 6f18a66..098ab6f 100644 --- a/src/game/hexWorld/ecs/components/BuildingComponent.h +++ b/src/game/hexWorld/ecs/components/BuildingComponent.h @@ -7,7 +7,8 @@ #include "../../../../engine/core/ECS/EntityManager.h" enum class BuildingType { - FOREST_HUT + FOREST_HUT, + STONE_MASON }; diff --git a/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.cpp b/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.cpp index 6cdc09c..442149a 100644 --- a/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.cpp +++ b/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.cpp @@ -31,7 +31,14 @@ void BuildingPlacementSystem::update(EntityManager& entityManager, GameMode& gam if (!transform || !gameplay || !render) continue; if (!render->isHighlighted) continue; - const auto &def = BuildingConfig::get(BuildingType::FOREST_HUT); + BuildingDefinition def; + if (gameMode.getActiveBuilding() == BuildingType::FOREST_HUT) { + def = BuildingConfig::get(BuildingType::FOREST_HUT); + } else if (gameMode.getActiveBuilding() == BuildingType::STONE_MASON) { + def = BuildingConfig::get(BuildingType::STONE_MASON); + } else { + continue; + } if (!BuildingRules::canPlace(def, *gameplay, gameMode, player)) continue; diff --git a/src/game/player/Player.h b/src/game/player/Player.h index cc9054c..e8bbf8f 100644 --- a/src/game/player/Player.h +++ b/src/game/player/Player.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "PlayerInventory.h" @@ -21,8 +22,9 @@ private: public: Player() = default; - Player(const PlayerID playerID, const std::string& name) : playerID(playerID), name(std::move(name)) { + Player(const PlayerID playerID, std::string name) : playerID(playerID), name(std::move(name)) { inventory->add(RessourceType::WOOD, 100); + inventory->add(RessourceType::STONE, 178); }; const std::unique_ptr &getInventory() const;