From 50e8c81cf035ce52cc895e182316a67a94fc6acd Mon Sep 17 00:00:00 2001 From: Douwe Ravers Date: Fri, 19 Jun 2026 00:08:04 +0200 Subject: [PATCH] Implemented auto building of containers. --- CMakeLists.txt | 4 +- douwco_hivemind/include/Room.hpp | 11 +--- douwco_hivemind/src/Creeps/Builder.cpp | 1 - douwco_hivemind/src/Creeps/Maintainer.cpp | 1 - douwco_hivemind/src/Creeps/Supplier.cpp | 1 - douwco_hivemind/src/Engine.cpp | 2 + douwco_hivemind/src/Room.cpp | 76 ++++++++++++++++++----- douwco_hivemind/src/Structures/Spawn.cpp | 8 +-- screepsxx | 2 +- 9 files changed, 74 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0f72ac..0784405 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(douwco_hivemind CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED On) # Generate compile commands set(CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/douwco_hivemind/include/Room.hpp b/douwco_hivemind/include/Room.hpp index d83661a..c87412f 100644 --- a/douwco_hivemind/include/Room.hpp +++ b/douwco_hivemind/include/Room.hpp @@ -2,20 +2,15 @@ #define DOUWCO_HIVEMIND_ROOM_HPP #include +#include namespace DouwcoHivemind { class Room { protected: - enum ProgressState { - PLANNED, - IN_PROGRESS, - FINISHED - }; - Screeps::Room room; JSON memory; - ProgressState _sourceContainerState; + std::vector sourceContainers = {}; public: Room(Screeps::Room rm); @@ -24,7 +19,7 @@ public: void loop(); protected: - bool assignConstructionSites(); + bool placeContainers(); }; } // namespace DouwcoHivemind diff --git a/douwco_hivemind/src/Creeps/Builder.cpp b/douwco_hivemind/src/Creeps/Builder.cpp index 5e806d1..4590c02 100644 --- a/douwco_hivemind/src/Creeps/Builder.cpp +++ b/douwco_hivemind/src/Creeps/Builder.cpp @@ -42,7 +42,6 @@ std::unique_ptr DouwcoHivemind::Builder::getConstruct if (!roomObj) { searchConstructionSite(); - if(target_id.empty()) creep.move(rand()%5); return nullptr; } diff --git a/douwco_hivemind/src/Creeps/Maintainer.cpp b/douwco_hivemind/src/Creeps/Maintainer.cpp index 059d377..dbc9c0a 100644 --- a/douwco_hivemind/src/Creeps/Maintainer.cpp +++ b/douwco_hivemind/src/Creeps/Maintainer.cpp @@ -38,7 +38,6 @@ std::unique_ptr DouwcoHivemind::Maintainer::getDamagedStruct if (!roomObj) { searchDamagedStructure(); - if(target_id.empty()) creep.move(rand()%5); return nullptr; } diff --git a/douwco_hivemind/src/Creeps/Supplier.cpp b/douwco_hivemind/src/Creeps/Supplier.cpp index ed4c598..40fbd9f 100644 --- a/douwco_hivemind/src/Creeps/Supplier.cpp +++ b/douwco_hivemind/src/Creeps/Supplier.cpp @@ -38,7 +38,6 @@ std::unique_ptr DouwcoHivemind::Supplier::getEnergyStructure if (!roomObj) { searchEnergyStructure(); - if(target_id.empty()) creep.move(rand()%5); return nullptr; } diff --git a/douwco_hivemind/src/Engine.cpp b/douwco_hivemind/src/Engine.cpp index 4da942e..9f17eca 100644 --- a/douwco_hivemind/src/Engine.cpp +++ b/douwco_hivemind/src/Engine.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "Engine.hpp" @@ -38,6 +39,7 @@ void DouwcoHivemind::Engine::ReadOutRooms() { JS::console.log(std::string("Reading out owned rooms")); auto src_rooms = Screeps::Game.rooms(); for (auto &room : src_rooms) { + if(!room.second.controller().value().my()) continue; rooms.push_back(std::make_unique(room.second)); } } diff --git a/douwco_hivemind/src/Room.cpp b/douwco_hivemind/src/Room.cpp index f7ad21c..7d5ca60 100644 --- a/douwco_hivemind/src/Room.cpp +++ b/douwco_hivemind/src/Room.cpp @@ -4,37 +4,85 @@ #include "Screeps/Room.hpp" #include "Screeps/RoomObject.hpp" #include "Screeps/RoomPosition.hpp" +#include "Screeps/RoomTerrain.hpp" +#include "Screeps/Structure.hpp" +#include "Screeps/StructureContainer.hpp" +#include "Screeps/StructureController.hpp" +#include +#include +#include +#include +#include +#include +#include DouwcoHivemind::Room::Room(Screeps::Room rm) : room(rm), memory(rm.memory()) { - _sourceContainerState = - memory.contains("_sourceContainerState") - ? static_cast(memory["_sourceContainerState"]) - : ProgressState::PLANNED; + if (memory.contains("sourceContainers")) + sourceContainers = + static_cast>(memory["sourceContainers"]); } DouwcoHivemind::Room::~Room() { - memory["_sourceContainerState"] = _sourceContainerState; + memory["sourceContainers"] = sourceContainers; + room.setMemory(memory); } void DouwcoHivemind::Room::loop() { - if (assignConstructionSites()) + if (placeContainers()) return; } -bool DouwcoHivemind::Room::assignConstructionSites() { - if (_sourceContainerState == PLANNED) { - auto sources = room.find(Screeps::FIND_SOURCES); +bool DouwcoHivemind::Room::placeContainers() { + auto sources = room.find(Screeps::FIND_SOURCES); + + // No containers planned or build, planning now + if (sourceContainers.size() == 0) { + int controller_x = room.controller().value().pos().x(); + int controller_y = room.controller().value().pos().y(); + for (auto &source : sources) { - int x = source->pos().x(); - int y = source->pos().y(); + int source_x = source->pos().x(); + int source_y = source->pos().y(); + + int lowest_cost = 1000; + int best_x; + int best_y; for (int dx = -1; dx < 2; dx++) { for (int dy = -1; dy < 2; dy++) { - if(dx == 0 && dy == 0) continue; - auto pos = room.getPositionAt(x + dx, y + dy); + if (dx == 0 && dy == 0) + continue; + int x = source_x + dx; + int y = source_y + dy; + int terrainType = room.getTerrain().get(x, y); + if (terrainType != Screeps::TERRAIN_MASK_WALL) { + int cost = std::abs(x - controller_x) + std::abs(y - controller_y); + if (cost < lowest_cost) { + lowest_cost = cost; + best_x = x; + best_y = y; + } + } } } + room.createConstructionSite(best_x, best_y, Screeps::STRUCTURE_CONTAINER); + sourceContainers.push_back("under_construction"); } - } else if (_sourceContainerState == IN_PROGRESS) { + return true; + } + // Check if construction container is done. + for (auto entry : sourceContainers) { + if (entry != "under_construction") + continue; + auto structures = room.find(Screeps::FIND_STRUCTURES); + int index = 0; + for (auto &structure : structures) { + auto str = dynamic_cast(structure.get()); + if (str->structureType() == Screeps::STRUCTURE_CONTAINER) { + sourceContainers[index] = str->id(); + index++; + } + } + return true; } return false; } \ No newline at end of file diff --git a/douwco_hivemind/src/Structures/Spawn.cpp b/douwco_hivemind/src/Structures/Spawn.cpp index d4d78d6..0d15a0b 100644 --- a/douwco_hivemind/src/Structures/Spawn.cpp +++ b/douwco_hivemind/src/Structures/Spawn.cpp @@ -12,10 +12,10 @@ void DouwcoHivemind::Spawn::loop() int energyAvailable = spawn.room().energyAvailable(); int energyCapacityAvailable = spawn.room().energyCapacityAvailable(); - + int required_upgraders = 1; int required_suppliers = 1; - int required_maintainers = spawn.room().find(Screeps::FIND_MY_STRUCTURES).size() <= 2 ? 0 : 1;; + int required_maintainers = spawn.room().find(Screeps::FIND_STRUCTURES).size() <= 2 ? 0 : 1;; int required_builders = spawn.room().find(Screeps::FIND_MY_CONSTRUCTION_SITES).size() == 0 ? 0 : 1; for (auto &creep : Screeps::Game.creeps()) { @@ -31,8 +31,8 @@ void DouwcoHivemind::Spawn::loop() required_builders--; } - if (energyAvailable < energyCapacityAvailable && 3 < Screeps::Game.creeps().size()) - return; + // if (energyAvailable < energyCapacityAvailable && 3 < Screeps::Game.creeps().size()) + // return; std::string name; JSON opts; if (required_suppliers > 0) diff --git a/screepsxx b/screepsxx index 3567060..bf5fd1f 160000 --- a/screepsxx +++ b/screepsxx @@ -1 +1 @@ -Subproject commit 3567060bf5846e7618f64ee9439b76550abc4351 +Subproject commit bf5fd1f69b251c6829d7847e3d5d2dbc7764a3b9