Miner not working properly but implementation is close.

This commit is contained in:
2026-06-22 23:30:49 +02:00
parent 50e8c81cf0
commit 6fcf742cfa
13 changed files with 391 additions and 321 deletions

View File

@@ -3,47 +3,35 @@
#include <Screeps/Creep.hpp> #include <Screeps/Creep.hpp>
namespace Screeps{ namespace Screeps {
class RoomPosition; class RoomPosition;
class RoomObject; class RoomObject;
class PathStep; class PathStep;
} } // namespace Screeps
namespace DouwcoHivemind namespace DouwcoHivemind {
{ enum CreepRole { UNEMPLOYED, SUPPLIER, UPGRADER, BUILDER, MAINTAINER, MINER };
enum CreepRole
{
UNEMPLOYED,
SUPPLIER,
UPGRADER,
BUILDER,
MAINTAINER
};
class CreepBase class CreepBase {
{ public:
public: CreepRole role;
CreepRole role; std::string target_id;
std::string target_id;
protected: protected:
Screeps::Creep creep; Screeps::Creep creep;
JSON memory; JSON memory;
public: public:
CreepBase(Screeps::Creep crp); CreepBase(Screeps::Creep crp);
virtual ~CreepBase(); virtual ~CreepBase();
virtual void loop() {} virtual void loop() {}
bool isNearTo(const Screeps::RoomPosition &pos, int dist);
protected:
bool isNearTo(const Screeps::RoomPosition &pos, int dist); void moveToTarget(int dist = 1);
std::unique_ptr<Screeps::RoomObject> getRoomObjectTarget();
};
protected: } // namespace DouwcoHivemind
void moveToTarget(int dist = 1);
std::unique_ptr<Screeps::RoomObject> getRoomObjectTarget();
};
}
#endif // DOUWCO_HIVEMIND_CREEPBASE_HPP #endif // DOUWCO_HIVEMIND_CREEPBASE_HPP

View File

@@ -0,0 +1,21 @@
#ifndef DOUWCO_HIVEMIND_MINER_HPP
#define DOUWCO_HIVEMIND_MINER_HPP
#include "Creeps/CreepBase.hpp"
#include <string>
namespace DouwcoHivemind
{
class Miner : public CreepBase
{
private:
bool arrivedAtContainer;
public:
Miner(Screeps::Creep crp);
~Miner() override;
void loop() override;
};
}
#endif // DOUWCO_HIVEMIND_MINER_HPP

View File

@@ -20,6 +20,7 @@ namespace DouwcoHivemind
virtual void depositEnergy(){} virtual void depositEnergy(){}
private: private:
void getEnergy();
void harvestSource(); void harvestSource();
std::unique_ptr<Screeps::Source> getSourceTarget(); std::unique_ptr<Screeps::Source> getSourceTarget();
void searchSource(); void searchSource();

View File

@@ -4,7 +4,7 @@
#include <vector> #include <vector>
#include "Creeps/CreepBase.hpp" #include "Creeps/CreepBase.hpp"
#include "Room.hpp" #include "Entity/Room.hpp"
#include "Structures/StructureBase.hpp" #include "Structures/StructureBase.hpp"
namespace DouwcoHivemind { namespace DouwcoHivemind {

View File

@@ -4,144 +4,142 @@
#include <Screeps/Room.hpp> #include <Screeps/Room.hpp>
#include <Screeps/RoomPosition.hpp> #include <Screeps/RoomPosition.hpp>
#include <cstddef> #include <cstddef>
#include <cstdlib>
#include "Creeps/CreepBase.hpp" #include "Creeps/CreepBase.hpp"
#include "Tools/JsonTool.hpp" #include "Tools/JsonTool.hpp"
#include "Tools/PathTool.hpp"
#include "Tools/MeasureTool.hpp" #include "Tools/MeasureTool.hpp"
#include "Tools/PathTool.hpp"
DouwcoHivemind::CreepBase::CreepBase(Screeps::Creep crp) : creep(crp), DouwcoHivemind::CreepBase::CreepBase(Screeps::Creep crp)
memory(crp.memory()) : creep(crp), memory(crp.memory()) {
{ role = memory.contains("role") ? static_cast<CreepRole>(memory["role"])
role = memory.contains("role") ? static_cast<CreepRole>(memory["role"]) : CreepRole::UNEMPLOYED; : CreepRole::UNEMPLOYED;
target_id = memory.contains("target_id") ? static_cast<std::string>(memory["target_id"]) : std::string(); target_id = memory.contains("target_id")
? static_cast<std::string>(memory["target_id"])
: std::string();
} }
DouwcoHivemind::CreepBase::~CreepBase() DouwcoHivemind::CreepBase::~CreepBase() {
{ memory["role"] = role;
memory["role"] = role; memory["target_id"] = target_id;
memory["target_id"] = target_id; creep.setMemory(memory);
creep.setMemory(memory);
} }
void DouwcoHivemind::CreepBase::moveToTarget(int dist) void DouwcoHivemind::CreepBase::moveToTarget(int dist) {
{ // Is move required?
// Is move required? auto target = getRoomObjectTarget();
auto target = getRoomObjectTarget(); if (isNearTo(target->pos(), dist)) {
if (isNearTo(target->pos(), dist)) memory.erase("path");
{ return;
memory.erase("path"); }
return;
// Is wating?
if (memory.contains("wait") && memory["wait"] > 0) {
memory["wait"] = memory["wait"].get<int>() - 1;
creep.say("Waiting..");
return;
}
// Is there a path to walk?
if (!memory.contains("path") || memory["path"].empty()) {
creep.say("Searching route!");
auto target_pos = target->pos();
auto path = creep.room().findPath(creep.pos(), target_pos);
auto last = path.back();
if (dist == 0) {
Screeps::Room::PathStep step;
step.x = target_pos.x();
step.y = target_pos.y();
step.dx = step.x - last.x;
step.dy = step.y - last.y;
path.push_back(step);
} }
if (abs(last.x - target_pos.x()) > dist ||
// Is wating? abs(last.y - target_pos.y()) > dist) {
if (memory.contains("wait") && memory["wait"] > 0) creep.say("No possible path");
{ memory["wait"] = rand() % 20;
memory["wait"] = memory["wait"].get<int>() - 1; return;
creep.say("Waiting..");
return;
} }
memory["path"] = vectorToJson(flattenPathSteps(path));
}
// Is there a path to walk? // JS::console.log(std::string("creep pos: [") +
if (!memory.contains("path") || memory["path"].empty()) // std::to_string(creep.pos().x()) +
{ // std::string(",") +
creep.say("Searching route!"); // std::to_string(creep.pos().y()) +
auto target_pos = target->pos(); // std::string("]"));
auto path = creep.room().findPath(creep.pos(), target_pos);
auto last = path.back(); // Get step from memory
if (last.x - target_pos.x() > dist || last.y - target_pos.y() > dist) int pathStepData[5] = {0};
{ if (memory["path"].size() > 5) {
creep.say("No possible path"); for (int i = 0; i < 5; i++) {
memory["wait"] = rand() % 20; pathStepData[i] = memory["path"][i];
return;
}
memory["path"] = vectorToJson(flattenPathSteps(path));
} }
} else {
memory.erase("path");
return;
}
// JS::console.log(std::string("creep pos: [") + // Is the move of last tick executed?
// std::to_string(creep.pos().x()) + int x = creep.pos().x();
// std::string(",") + int y = creep.pos().y();
// std::to_string(creep.pos().y()) +
// std::string("]"));
// Get step from memory Screeps::Room::PathStep step;
int pathStepData[5] = {0}; step.x = pathStepData[0];
if (memory["path"].size() > 5) step.y = pathStepData[1];
{ step.dx = pathStepData[2];
for (int i = 0; i < 5; i++) step.dy = pathStepData[3];
{ step.direction = pathStepData[4];
pathStepData[i] = memory["path"][i];
} if (memory.contains("last_pos")) {
int last_x = memory["last_pos"]["x"];
int last_y = memory["last_pos"]["y"];
memory.erase("last_pos");
if (x == last_x && y == last_y) {
creep.say("I'm stuck!");
memory["wait"] = rand() % 5;
return;
} }
else }
{
memory.erase("path"); // Is the creep on the place intended by the path?
return; if (!(x == step.x - step.dx && y == step.y - step.dy)) {
} creep.say("I'm lost!");
memory["wait"] = rand() % 5;
// Is the move of last tick executed? memory.erase("path");
int x = creep.pos().x(); return;
int y = creep.pos().y(); }
Screeps::Room::PathStep step; // Lets move forward
step.x = pathStepData[0]; int resp = creep.move(step.direction);
step.y = pathStepData[1]; if (resp == Screeps::OK) {
step.dx = pathStepData[2]; memory["last_pos"]["x"] = x;
step.dy = pathStepData[3]; memory["last_pos"]["y"] = y;
step.direction = pathStepData[4];
for (int i = 0; i < 5; i++) {
if (memory.contains("last_pos")) memory["path"].erase(0);
{
int last_x = memory["last_pos"]["x"];
int last_y = memory["last_pos"]["y"];
memory.erase("last_pos");
if (x == last_x && y == last_y)
{
creep.say("I'm stuck!");
memory["wait"] = rand() % 5;
return;
}
}
// Is the creep on the place intended by the path?
if (!(x == step.x - step.dx && y == step.y - step.dy))
{
creep.say("I'm lost!");
memory["wait"] = rand() % 5;
memory.erase("path");
return;
}
// Lets move forward
int resp = creep.move(step.direction);
if (resp == Screeps::OK)
{
memory["last_pos"]["x"] = x;
memory["last_pos"]["y"] = y;
for (int i = 0; i < 5; i++)
{
memory["path"].erase(0);
}
} }
}
} }
std::unique_ptr<Screeps::RoomObject> DouwcoHivemind::CreepBase::getRoomObjectTarget() std::unique_ptr<Screeps::RoomObject>
{ DouwcoHivemind::CreepBase::getRoomObjectTarget() {
// Check if any target is present // Check if any target is present
if(target_id.empty()) return nullptr; if (target_id.empty())
// Check if game can find target return nullptr;
auto roomObj = Screeps::Game.getObjectById(target_id); // Check if game can find target
if (!roomObj) auto roomObj = Screeps::Game.getObjectById(target_id);
{ if (!roomObj) {
JS::console.log(creep.name() + ": Game can\'t find target id: " + target_id); JS::console.log(creep.name() +
return nullptr; ": Game can\'t find target id: " + target_id);
} return nullptr;
return std::move(roomObj); }
return std::move(roomObj);
} }
bool DouwcoHivemind::CreepBase::isNearTo(const Screeps::RoomPosition &pos, int dist) bool DouwcoHivemind::CreepBase::isNearTo(const Screeps::RoomPosition &pos,
{ int dist) {
return DouwcoHivemind::isNearTo(creep.pos(), pos, dist); return DouwcoHivemind::isNearTo(creep.pos(), pos, dist);
} }

View File

@@ -17,6 +17,7 @@
#include "Creeps/Maintainer.hpp" #include "Creeps/Maintainer.hpp"
#include "Creeps/CreepBase.hpp" #include "Creeps/CreepBase.hpp"
#include "Screeps/Constants.hpp"
void DouwcoHivemind::Maintainer::depositEnergy() void DouwcoHivemind::Maintainer::depositEnergy()
{ {
@@ -61,22 +62,24 @@ std::unique_ptr<Screeps::Structure> DouwcoHivemind::Maintainer::getDamagedStruct
void DouwcoHivemind::Maintainer::searchDamagedStructure() void DouwcoHivemind::Maintainer::searchDamagedStructure()
{ {
int lowestMaintaince = INT16_MAX; int highestDamage = 0;
Screeps::Structure *selectedStructure; Screeps::Structure *selectedStructure;
auto structures = creep.room().find(Screeps::FIND_STRUCTURES); auto structures = creep.room().find(Screeps::FIND_STRUCTURES);
for (auto &structureObject : structures) for (auto &structureObject : structures)
{ {
auto structure = dynamic_cast<Screeps::Structure *>(structureObject.get()); auto structure = dynamic_cast<Screeps::Structure *>(structureObject.release());
if (!structure) if (!structure)
continue; continue;
int maintance = structure->hits(); int damage = structure->hitsMax() - structure->hits();
auto structureType = structure->structureType(); auto structureType = structure->structureType();
if (structureType == Screeps::STRUCTURE_CONTROLLER) if (structureType == Screeps::STRUCTURE_CONTROLLER)
continue; continue;
if (maintance < lowestMaintaince) if(structureType == Screeps::STRUCTURE_WALL || structureType == Screeps::STRUCTURE_RAMPART)
continue; // todo cover this situation as well.
if (highestDamage < damage)
{ {
lowestMaintaince = maintance; highestDamage = damage;
selectedStructure = structure; selectedStructure = structure;
} }
} }

View File

@@ -0,0 +1,42 @@
#include "Creeps/Miner.hpp"
#include "Creeps/CreepBase.hpp"
#include "Screeps/Constants.hpp"
#include "Screeps/Creep.hpp"
#include "Screeps/Room.hpp"
#include "Screeps/RoomPosition.hpp"
#include "Screeps/Source.hpp"
#include <string>
DouwcoHivemind::Miner::Miner(Screeps::Creep crp) : CreepBase(crp) {
arrivedAtContainer = memory.contains("arrivedAtContainer")
? static_cast<bool>(memory["arrivedAtContainer"])
: false;
}
DouwcoHivemind::Miner::~Miner() {
memory["arrivedAtContainer"] = arrivedAtContainer;
}
void DouwcoHivemind::Miner::loop() {
if (arrivedAtContainer) {
auto source =
static_cast<Screeps::Source *>(getRoomObjectTarget().release());
creep.harvest(*source);
} else {
auto container = getRoomObjectTarget();
if (!container)
return;
if (isNearTo(container->pos(), 0)) {
arrivedAtContainer = true;
int x = creep.pos().x();
int y = creep.pos().y();
auto roomObjs = creep.room().lookForAtArea(Screeps::LOOK_SOURCES, y - 1,
x - 1, y + 1, x + 1);
return; // fault is here somewhere
auto source = static_cast<Screeps::Source *>(roomObjs[0].release());
target_id = source->id();
} else {
moveToTarget(0);
}
}
}

View File

@@ -1,123 +1,130 @@
#include <vector>
#include <optional>
#include <emscripten.h> #include <emscripten.h>
#include <optional>
#include <string>
#include <vector>
#include <Screeps/Game.hpp> #include <Screeps/Constants.hpp>
#include <Screeps/Creep.hpp> #include <Screeps/Creep.hpp>
#include <Screeps/Source.hpp> #include <Screeps/Game.hpp>
#include <Screeps/Room.hpp> #include <Screeps/Room.hpp>
#include <Screeps/RoomPosition.hpp>
#include <Screeps/RoomObject.hpp> #include <Screeps/RoomObject.hpp>
#include <Screeps/RoomPosition.hpp>
#include <Screeps/Source.hpp>
#include <Screeps/Store.hpp>
#include <Screeps/Structure.hpp> #include <Screeps/Structure.hpp>
#include <Screeps/StructureController.hpp> #include <Screeps/StructureController.hpp>
#include <Screeps/StructureSpawn.hpp>
#include <Screeps/StructureExtension.hpp> #include <Screeps/StructureExtension.hpp>
#include <Screeps/StructureSpawn.hpp>
#include <Screeps/StructureTower.hpp> #include <Screeps/StructureTower.hpp>
#include <Screeps/Constants.hpp>
#include <Screeps/Store.hpp>
#include "Creeps/Worker.hpp" #include "Creeps/Worker.hpp"
#include "Screeps/StructureContainer.hpp"
DouwcoHivemind::Worker::Worker(Screeps::Creep crp) : CreepBase(crp) DouwcoHivemind::Worker::Worker(Screeps::Creep crp) : CreepBase(crp) {
{ harvesting = memory.contains("harvesting")
harvesting = memory.contains("harvesting") ? static_cast<bool>(memory["harvesting"]) : false; ? static_cast<bool>(memory["harvesting"])
: false;
} }
DouwcoHivemind::Worker::~Worker() DouwcoHivemind::Worker::~Worker() { memory["harvesting"] = harvesting; }
{
memory["harvesting"] = harvesting; void DouwcoHivemind::Worker::loop() {
if (harvesting) {
if (creep.store().getFreeCapacity(Screeps::RESOURCE_ENERGY) == 0) {
harvesting = false;
target_id.clear();
}
getEnergy();
} else {
if (creep.store().getUsedCapacity(Screeps::RESOURCE_ENERGY) == 0) {
harvesting = true;
target_id.clear();
}
depositEnergy();
}
} }
void DouwcoHivemind::Worker::loop() void DouwcoHivemind::Worker::getEnergy() {
{ for (auto containersJSON : creep.room().memory()["sourceContainers"]) {
if (harvesting) auto containerID = static_cast<std::string>(containersJSON);
{ target_id = containerID;
if (creep.store().getFreeCapacity(Screeps::RESOURCE_ENERGY) == 0) auto containerRoomObject = getRoomObjectTarget();
{ auto container = static_cast<Screeps::StructureContainer *>(
harvesting = false; containerRoomObject.release());
target_id.clear(); if (0 < container->store().getUsedCapacity(Screeps::RESOURCE_ENERGY)) {
} if (isNearTo(container->pos(), 1)) {
harvestSource(); int resp = creep.withdraw(*container, Screeps::RESOURCE_ENERGY);
} } else {
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(); moveToTarget();
}
} }
}
harvestSource();
} }
std::unique_ptr<Screeps::Source> DouwcoHivemind::Worker::getSourceTarget() void DouwcoHivemind::Worker::harvestSource() {
{ auto source = getSourceTarget();
auto roomObj = getRoomObjectTarget(); if (!source)
if (!roomObj) return;
{
searchSource();
return nullptr;
}
// Check if found roomobject is an actual source if (isNearTo(source->pos(), 1)) {
auto source = std::unique_ptr<Screeps::Source>(dynamic_cast<Screeps::Source *>(roomObj.release())); int resp = creep.harvest(*source);
if (!source) } else {
{ moveToTarget();
// 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 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) if (source->energy() == 0)
{ continue;
searchSource(); int dx = source->pos().x() - x;
return nullptr; int dy = source->pos().y() - y;
int distance = dx * dx + dy * dy;
if (distance < closestDistance) {
closestDistance = distance;
selectedSource = source;
} }
}
return std::move(source); if (!selectedSource)
} return;
target_id = selectedSource->id();
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();
} }

View File

@@ -6,8 +6,10 @@
#include "Creeps/Builder.hpp" #include "Creeps/Builder.hpp"
#include "Creeps/Maintainer.hpp" #include "Creeps/Maintainer.hpp"
#include "Creeps/Miner.hpp"
#include "Creeps/Supplier.hpp" #include "Creeps/Supplier.hpp"
#include "Creeps/Upgrader.hpp" #include "Creeps/Upgrader.hpp"
#include "Creeps/Miner.hpp"
#include "Structures/Spawn.hpp" #include "Structures/Spawn.hpp"
@@ -57,6 +59,8 @@ void DouwcoHivemind::Engine::ReadOutCreeps() {
creeps.push_back(std::make_unique<Builder>(creep.second)); creeps.push_back(std::make_unique<Builder>(creep.second));
else if (role == CreepRole::MAINTAINER) else if (role == CreepRole::MAINTAINER)
creeps.push_back(std::make_unique<Maintainer>(creep.second)); creeps.push_back(std::make_unique<Maintainer>(creep.second));
else if (role == CreepRole::MINER)
creeps.push_back(std::make_unique<Miner>(creep.second));
} }
} }

View File

@@ -1,4 +1,4 @@
#include "Room.hpp" #include "Entity/Room.hpp"
#include "Screeps/Constants.hpp" #include "Screeps/Constants.hpp"
#include "Screeps/Room.hpp" #include "Screeps/Room.hpp"

View File

@@ -4,70 +4,76 @@
#include "Creeps/CreepBase.hpp" #include "Creeps/CreepBase.hpp"
#include "Structures/Spawn.hpp" #include "Structures/Spawn.hpp"
void DouwcoHivemind::Spawn::loop() void DouwcoHivemind::Spawn::loop() {
{ // Only run every 50 ticks
// Only run every 50 ticks if (Screeps::Game.time() % 50 != 0)
if (Screeps::Game.time() % 50 != 0) return;
return;
int energyAvailable = spawn.room().energyAvailable(); int energyAvailable = spawn.room().energyAvailable();
int energyCapacityAvailable = spawn.room().energyCapacityAvailable(); int energyCapacityAvailable = spawn.room().energyCapacityAvailable();
int required_upgraders = 1;
int required_suppliers = 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())
{
CreepRole role = creep.second.memory()["role"];
if (role == CreepRole::SUPPLIER) int required_upgraders = 1;
required_suppliers--; int required_suppliers = 1;
else if (role == CreepRole::UPGRADER) int required_maintainers =
required_upgraders--; spawn.room().find(Screeps::FIND_STRUCTURES).size() <= 2 ? 0 : 1;
else if (role == CreepRole::MAINTAINER) ;
required_maintainers--; int required_builders =
else if (role == CreepRole::BUILDER) spawn.room().find(Screeps::FIND_MY_CONSTRUCTION_SITES).size() == 0 ? 0
required_builders--; : 1;
} int required_miners = 1; //spawn.room().memory()["sourceContainers"].size();
for (auto &creep : Screeps::Game.creeps()) {
CreepRole role = creep.second.memory()["role"];
// if (energyAvailable < energyCapacityAvailable && 3 < Screeps::Game.creeps().size()) if (role == CreepRole::SUPPLIER)
// return; required_suppliers--;
std::string name; else if (role == CreepRole::UPGRADER)
JSON opts; required_upgraders--;
if (required_suppliers > 0) else if (role == CreepRole::MAINTAINER)
{ required_maintainers--;
opts["memory"]["role"] = CreepRole::SUPPLIER; else if (role == CreepRole::BUILDER)
name = "Supplier: "; required_builders--;
} else if (role == CreepRole::MINER)
else if (required_upgraders > 0) required_miners--;
{ }
opts["memory"]["role"] = CreepRole::UPGRADER;
name = "Upgrader: ";
}
else if (required_builders > 0)
{
opts["memory"]["role"] = CreepRole::BUILDER;
name = "Builder: ";
}
else if (required_maintainers > 0)
{
opts["memory"]["role"] = CreepRole::MAINTAINER;
name = "Maintainer: ";
}
else
return;
std::vector<std::string> body; // if (energyAvailable < energyCapacityAvailable && 3 <
for (int i = 0; i < energyAvailable / 200; i++) // Screeps::Game.creeps().size())
{ // return;
body.push_back("work"); std::string name;
body.push_back("carry"); JSON opts;
body.push_back("move"); if (required_upgraders > 0) {
} opts["memory"]["role"] = CreepRole::UPGRADER;
name = "Upgrader: ";
} else if (required_miners > 0) {
opts["memory"]["role"] = CreepRole::MINER;
opts["memory"]["target_id"] =
spawn.room().memory()["sourceContainers"][0]; // make logic for more
name = "Miner: ";
} else if (required_suppliers > 0) {
opts["memory"]["role"] = CreepRole::SUPPLIER;
name = "Supplier: ";
} else if (required_builders > 0) {
opts["memory"]["role"] = CreepRole::BUILDER;
name = "Builder: ";
} else if (required_maintainers > 0) {
opts["memory"]["role"] = CreepRole::MAINTAINER;
name = "Maintainer: ";
} else
return;
spawn.spawnCreep( std::vector<std::string> body;
body, if (opts["memory"]["role"] == CreepRole::MINER) {
name + std::to_string(Screeps::Game.time()), body.push_back("move");
opts); for (int i = 0; i < (energyAvailable - 50) / 100 && i < 5; i++) {
body.push_back("work");
}
} else {
for (int i = 0; i < energyAvailable / 200; i++) {
body.push_back("work");
body.push_back("carry");
body.push_back("move");
}
}
spawn.spawnCreep(body, name + std::to_string(Screeps::Game.time()), opts);
} }