Dicewars-Siedler/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.cpp
2026-02-21 07:09:44 +01:00

71 lines
2.8 KiB
C++

//
// Created by sebastian on 08.02.26.
//
#include "BuildingPlacementSystem.h"
#include "../../RessourceType.h"
#include "../../../../engine/core/Application.h"
#include "../../../../engine/core/ECS/ModelComponent.h"
#include "../../../../engine/core/ECS/TileRenderComponent.h"
#include "../../../../engine/core/ECS/TransformComponent.h"
#include "../../../../engine/platform/glfw/InputManager.h"
#include "../../../../engine/renderer/loader/AssetManager.h"
#include "../../building/BuildingConfig.h"
#include "../../building/BuildingFactory.h"
#include "../../building/BuildingRules.h"
#include "../../gameplay/TurnState.h"
#include "../components/BuildingComponent.h"
#include "../components/TileGameplayComponent.h"
#include "../components/UpgradeComponent.h"
#include "GLFW/glfw3.h"
void BuildingPlacementSystem::update(EntityManager& entityManager, GameMode& gameMode, PlayerID player, const TurnState& turnState) {
if (!gameMode.hasTurn(player, turnState.currentTurn)) {
return;
}
if (!InputManager::isMouseButtonPressed(GLFW_MOUSE_BUTTON_LEFT)) {
return;
}
for (EntityID entityID : entityManager.getAllEntities()) {
auto transform = entityManager.getComponent<TransformComponent>(entityID);
auto gameplay = entityManager.getComponent<TileGameplayComponent>(entityID);
auto render = entityManager.getComponent<TileRenderComponent>(entityID);
auto owner = entityManager.getComponent<OwnerComponent>(entityID);
if (!transform || !gameplay || !render || !owner) continue;
if (!render->isHighlighted) continue;
if (owner->playerID != player) continue;
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;
gameMode.pay(player, def.resourceCosts);
for (auto e : gameplay->entitiesOnTile) {
entityManager.destroyEntity(e);
}
gameplay->entitiesOnTile.clear();
const EntityID buildingEntity = BuildingFactory::create(entityManager, def, *transform, entityID, player);
gameplay->buildingEntityID = buildingEntity;
if (!def.levels.empty()) {
std::cerr << "Adding upgrade component" << std::endl;
UpgradeComponent upgrade_component = UpgradeComponent(1, static_cast<int>(def.levels.size() + 1));
entityManager.addComponent(buildingEntity, std::make_shared<UpgradeComponent>(upgrade_component));
}
break;
}
};