#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Creeps/Supplier.hpp" void DouwcoHivemind::Supplier::depositEnergy() { auto structure = getEnergyStructureTarget(); if (!structure) return; if (isNearTo(structure->pos(), 1)) { int resp = creep.transfer(*structure, Screeps::RESOURCE_ENERGY); } else { moveToTarget(); } } std::unique_ptr DouwcoHivemind::Supplier::getEnergyStructureTarget() { auto roomObj = getRoomObjectTarget(); if (!roomObj) { searchEnergyStructure(); return nullptr; } auto structure = std::unique_ptr(dynamic_cast(roomObj.release())); if (!structure) { searchEnergyStructure(); return nullptr; } // Check if the structure can receive energy to harvest int energyCapacity; auto structureType = structure->structureType(); if (structureType == Screeps::STRUCTURE_SPAWN) { auto spawn = dynamic_cast(structure.get()); energyCapacity = spawn->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } else if (structureType == Screeps::STRUCTURE_EXTENSION) { auto extension = dynamic_cast(structure.get()); energyCapacity = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } else if (structureType == Screeps::STRUCTURE_TOWER) { auto extension = dynamic_cast(structure.get()); energyCapacity = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } if (energyCapacity == 0) { searchEnergyStructure(); return nullptr; } return std::move(structure); } void DouwcoHivemind::Supplier::searchEnergyStructure() { int mostEnergyNeeded = 0; Screeps::Structure *selectedStructure; auto structures = creep.room().find(Screeps::FIND_MY_STRUCTURES); for (auto &structureObject : structures) { auto structure = dynamic_cast(structureObject.get()); if (!structure) continue; int energyRequired; auto structureType = structure->structureType(); if (structureType == Screeps::STRUCTURE_SPAWN) { auto spawn = dynamic_cast(structure); energyRequired = spawn->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } else if (structureType == Screeps::STRUCTURE_EXTENSION) { auto extension = dynamic_cast(structure); energyRequired = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } else if (structureType == Screeps::STRUCTURE_TOWER) { auto extension = dynamic_cast(structure); energyRequired = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value(); } if (energyRequired > mostEnergyNeeded) { mostEnergyNeeded = energyRequired; selectedStructure = structure; } } if (selectedStructure) target_id = selectedStructure->id(); else target_id.clear(); }