124 lines
2.9 KiB
C++
124 lines
2.9 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/Constants.hpp>
|
|
#include <Screeps/Store.hpp>
|
|
|
|
#include "Creeps/Worker.hpp"
|
|
|
|
DouwcoHivemind::Worker::Worker(Screeps::Creep crp) : CreepBase(crp)
|
|
{
|
|
harvesting = memory.contains("harvesting") ? static_cast<bool>(memory["harvesting"]) : false;
|
|
}
|
|
|
|
DouwcoHivemind::Worker::~Worker()
|
|
{
|
|
memory["harvesting"] = harvesting;
|
|
}
|
|
|
|
void DouwcoHivemind::Worker::loop()
|
|
{
|
|
if (harvesting)
|
|
{
|
|
if (creep.store().getFreeCapacity(Screeps::RESOURCE_ENERGY) == 0)
|
|
{
|
|
harvesting = false;
|
|
target_id.clear();
|
|
}
|
|
harvestSource();
|
|
}
|
|
else
|
|
{
|
|
if (creep.store().getUsedCapacity(Screeps::RESOURCE_ENERGY) == 0)
|
|
{
|
|
harvesting = true;
|
|
target_id.clear();
|
|
}
|
|
depositEnergy();
|
|
}
|
|
}
|
|
|
|
void DouwcoHivemind::Worker::harvestSource()
|
|
{
|
|
auto source = getSourceTarget();
|
|
if (!source)
|
|
return;
|
|
|
|
if (isNearTo(source->pos(), 1))
|
|
{
|
|
int resp = creep.harvest(*source);
|
|
}
|
|
else
|
|
{
|
|
moveToTarget();
|
|
}
|
|
}
|
|
|
|
std::unique_ptr<Screeps::Source> DouwcoHivemind::Worker::getSourceTarget()
|
|
{
|
|
auto roomObj = getRoomObjectTarget();
|
|
if (!roomObj)
|
|
{
|
|
searchSource();
|
|
return nullptr;
|
|
}
|
|
|
|
// Check if found roomobject is an actual source
|
|
auto source = std::unique_ptr<Screeps::Source>(dynamic_cast<Screeps::Source *>(roomObj.release()));
|
|
if (!source)
|
|
{
|
|
// EM_ASM({console.log($0 + ': Can\'t cast target to Source')}, creep.name().c_str());
|
|
searchSource();
|
|
return nullptr;
|
|
}
|
|
|
|
// Check if the source still has energy to harvest
|
|
if (source->energy() == 0)
|
|
{
|
|
searchSource();
|
|
return nullptr;
|
|
}
|
|
|
|
return std::move(source);
|
|
}
|
|
|
|
void DouwcoHivemind::Worker::searchSource()
|
|
{
|
|
target_id.clear();
|
|
|
|
auto sources = creep.room().find(Screeps::FIND_SOURCES_ACTIVE);
|
|
if (sources.size() == 0)
|
|
return;
|
|
|
|
int x = creep.pos().x();
|
|
int y = creep.pos().y();
|
|
|
|
int closestDistance = INT16_MAX;
|
|
Screeps::Source *selectedSource;
|
|
for(auto &sourceObject : sources){
|
|
auto source =dynamic_cast<Screeps::Source *>(sourceObject.get());
|
|
if(source->energy()==0) continue;
|
|
int dx = source->pos().x() - x;
|
|
int dy = source->pos().y() - y;
|
|
int distance = dx*dx + dy*dy;
|
|
if(distance < closestDistance){
|
|
closestDistance = distance;
|
|
selectedSource = source;
|
|
}
|
|
}
|
|
if(!selectedSource) return;
|
|
target_id = selectedSource->id();
|
|
}
|