121 lines
3.7 KiB
C++
121 lines
3.7 KiB
C++
#include <vector>
|
|
#include <optional>
|
|
#include <emscripten.h>
|
|
|
|
#include <Screeps/Game.hpp>
|
|
#include <Screeps/Creep.hpp>
|
|
#include <Screeps/Source.hpp>
|
|
#include <Screeps/Room.hpp>
|
|
#include <Screeps/RoomPosition.hpp>
|
|
#include <Screeps/RoomObject.hpp>
|
|
#include <Screeps/Structure.hpp>
|
|
#include <Screeps/StructureController.hpp>
|
|
#include <Screeps/StructureSpawn.hpp>
|
|
#include <Screeps/StructureExtension.hpp>
|
|
#include <Screeps/StructureTower.hpp>
|
|
#include <Screeps/Store.hpp>
|
|
|
|
#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<Screeps::Structure> DouwcoHivemind::Supplier::getEnergyStructureTarget()
|
|
{
|
|
auto roomObj = getRoomObjectTarget();
|
|
if (!roomObj)
|
|
{
|
|
searchEnergyStructure();
|
|
return nullptr;
|
|
}
|
|
|
|
auto structure = std::unique_ptr<Screeps::Structure>(dynamic_cast<Screeps::Structure *>(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<Screeps::StructureSpawn *>(structure.get());
|
|
energyCapacity = spawn->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value();
|
|
}
|
|
else if (structureType == Screeps::STRUCTURE_EXTENSION)
|
|
{
|
|
auto extension = dynamic_cast<Screeps::StructureExtension *>(structure.get());
|
|
energyCapacity = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value();
|
|
}
|
|
else if (structureType == Screeps::STRUCTURE_TOWER)
|
|
{
|
|
auto extension = dynamic_cast<Screeps::StructureTower *>(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<Screeps::Structure *>(structureObject.get());
|
|
if (!structure)
|
|
continue;
|
|
|
|
int energyRequired;
|
|
|
|
auto structureType = structure->structureType();
|
|
if (structureType == Screeps::STRUCTURE_SPAWN)
|
|
{
|
|
auto spawn = dynamic_cast<Screeps::StructureSpawn *>(structure);
|
|
energyRequired = spawn->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value();
|
|
}
|
|
else if (structureType == Screeps::STRUCTURE_EXTENSION)
|
|
{
|
|
auto extension = dynamic_cast<Screeps::StructureExtension *>(structure);
|
|
energyRequired = extension->store().getFreeCapacity(Screeps::RESOURCE_ENERGY).value();
|
|
}
|
|
else if (structureType == Screeps::STRUCTURE_TOWER)
|
|
{
|
|
auto extension = dynamic_cast<Screeps::StructureTower *>(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();
|
|
}
|