refactor 4 space indent

This commit is contained in:
facat 2020-10-26 16:45:02 +08:00
parent 13d37b94f3
commit 98b97cbca6
12 changed files with 650 additions and 627 deletions

View File

@ -13,7 +13,8 @@
},
"rules": {
"prettier/prettier": ["error",{
"endOfLine":"auto"
"endOfLine":"auto",
"tabWidth":4
}]
},
"plugins": [

View File

@ -5,97 +5,101 @@
const utils = require("./utils");
function upgradeController_job(creep) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (utils.distance(creep.pos, working_target.pos) > 1.5) {
creep.moveTo(working_target);
} else {
const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
energy
) {
return (
energy.resourceType === RESOURCE_ENERGY &&
utils.distance(energy.pos, creep.pos) < 1.5
);
});
if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
// TODO:需要适应不同的建筑
const Re_code = creep.upgradeController(working_target);
// eslint-disable-next-line no-empty
if (OK === Re_code) {
} else if (
Re_code !== ERR_NOT_ENOUGH_RESOURCES &&
Re_code !== ERR_NOT_IN_RANGE
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (utils.distance(creep.pos, working_target.pos) > 1.5) {
creep.moveTo(working_target);
} else {
const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
energy
) {
console.log(
`${creep.name} failed to upgrade room controller:err ${Re_code}`
);
return (
energy.resourceType === RESOURCE_ENERGY &&
utils.distance(energy.pos, creep.pos) < 1.5
);
});
if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
// TODO:需要适应不同的建筑
const Re_code = creep.upgradeController(working_target);
// eslint-disable-next-line no-empty
if (OK === Re_code) {
} else if (
Re_code !== ERR_NOT_ENOUGH_RESOURCES &&
Re_code !== ERR_NOT_IN_RANGE
) {
console.log(
`${creep.name} failed to upgrade room controller:err ${Re_code}`
);
}
} else {
console.log(
`${creep.name} failed to pickup: err ${Re_code_pickup}`
);
}
}
} else {
console.log(`${creep.name} failed to pickup: err ${Re_code_pickup}`);
}
}
}
}
function build_construction(creep) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (utils.distance(creep.pos, working_target.pos) > 1.5) {
creep.moveTo(working_target);
} else {
const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
energy
) {
return (
energy.resourceType === RESOURCE_ENERGY &&
utils.distance(energy.pos, creep.pos) < 1.5
);
});
if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
// TODO:需要适应不同的建筑
const Re_code = creep.build(working_target);
// eslint-disable-next-line no-empty
if (OK === Re_code) {
} else if (
Re_code !== ERR_NOT_ENOUGH_RESOURCES &&
Re_code !== ERR_NOT_IN_RANGE
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (utils.distance(creep.pos, working_target.pos) > 1.5) {
creep.moveTo(working_target);
} else {
const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
energy
) {
console.log(`${creep.name} failed to build:err ${Re_code}`);
return (
energy.resourceType === RESOURCE_ENERGY &&
utils.distance(energy.pos, creep.pos) < 1.5
);
});
if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
// TODO:需要适应不同的建筑
const Re_code = creep.build(working_target);
// eslint-disable-next-line no-empty
if (OK === Re_code) {
} else if (
Re_code !== ERR_NOT_ENOUGH_RESOURCES &&
Re_code !== ERR_NOT_IN_RANGE
) {
console.log(`${creep.name} failed to build:err ${Re_code}`);
}
} else {
console.log(
`${creep.name} failed to pickup: err ${Re_code_pickup}`
);
}
}
} else {
console.log(`${creep.name} failed to pickup: err ${Re_code_pickup}`);
}
}
}
}
module.exports = {
run(creep) {
if (creep.working_target_id) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (!working_target) {
// creep.working_target_id=undefined//目标已经完成,转为空闲状态
// _.each(Memery.WorkingTarget[creep.name].working_creep_names,creep_name=>Game.creeps[creep_name].working_target_id=undefined)
// delete Memery.WorkingTarget[creep.name]
return;
}
if (working_target.structureType === STRUCTURE_CONTROLLER) {
creep.say("ug");
upgradeController_job(creep);
return;
}
creep.say("bd");
build_construction(creep);
} else {
creep.say("SB");
}
},
run(creep) {
if (creep.working_target_id) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (!working_target) {
// creep.working_target_id=undefined//目标已经完成,转为空闲状态
// _.each(Memery.WorkingTarget[creep.name].working_creep_names,creep_name=>Game.creeps[creep_name].working_target_id=undefined)
// delete Memery.WorkingTarget[creep.name]
return;
}
if (working_target.structureType === STRUCTURE_CONTROLLER) {
creep.say("ug");
upgradeController_job(creep);
return;
}
creep.say("bd");
build_construction(creep);
} else {
creep.say("SB");
}
},
};

View File

@ -1,13 +1,15 @@
/* eslint-disable no-undef */
module.exports = {
run(creep) {
if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
if (
creep.transfer(Game.spawns.Spawn1.room.controller, RESOURCE_ENERGY) ===
ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1.room.controller.pos);
}
}
},
run(creep) {
if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
if (
creep.transfer(
Game.spawns.Spawn1.room.controller,
RESOURCE_ENERGY
) === ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1.room.controller.pos);
}
}
},
};

View File

@ -3,65 +3,65 @@
const path = require("path");
function harvester_job(creep) {
if (creep.carry.energy < creep.carryCapacity) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (creep.harvest(working_target) === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target);
path.visualPath(creep.pos, working_target.pos);
if (creep.carry.energy < creep.carryCapacity) {
const { working_target_id } = creep;
const working_target = Game.getObjectById(working_target_id);
if (creep.harvest(working_target) === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target);
path.visualPath(creep.pos, working_target.pos);
}
} else if (
creep.transfer(Game.spawns.Spawn1, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1);
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
} else if (
creep.transfer(Game.spawns.Spawn1, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1);
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
}
function picker_job(creep) {
if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
creep.say("SB");
return;
}
const { working_target_id } = creep;
if (!working_target_id) {
creep.say("SB");
}
const working_target = Game.getObjectById(working_target_id);
const Re_code = creep.harvest(working_target);
if (Re_code === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target);
} else if (OK === Re_code) {
creep.harvest(working_target);
creep.drop(RESOURCE_ENERGY);
}
if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
creep.say("SB");
return;
}
const { working_target_id } = creep;
if (!working_target_id) {
creep.say("SB");
}
const working_target = Game.getObjectById(working_target_id);
const Re_code = creep.harvest(working_target);
if (Re_code === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target);
} else if (OK === Re_code) {
creep.harvest(working_target);
creep.drop(RESOURCE_ENERGY);
}
}
function change_status() {
if (
_(Game.creeps)
.filter({ memory: { role: "transfer" } })
.size() > 0
) {
return "picker";
}
return "harvester";
if (
_(Game.creeps)
.filter({ memory: { role: "transfer" } })
.size() > 0
) {
return "picker";
}
return "harvester";
}
module.exports = {
run(creep) {
const status = change_status();
switch (status) {
case "harvester":
creep.say("hv");
harvester_job(creep);
break;
case "picker":
creep.say("pc");
picker_job(creep);
break;
default:
break;
}
},
run(creep) {
const status = change_status();
switch (status) {
case "harvester":
creep.say("hv");
harvester_job(creep);
break;
case "picker":
creep.say("pc");
picker_job(creep);
break;
default:
break;
}
},
};

22
init.js
View File

@ -1,14 +1,14 @@
/* eslint-disable no-undef */
module.exports = {
init() {
if (!Memory.Task) {
Memory.Task = {};
}
Memory.Task.HighPorioty = [];
Memory.Task.LowPorioty = [];
// WorkingTarget是被跟踪物可以是一个structure、energy、constructionSite也可以是一个creep
if (!Memory.WorkingTarget) {
Memory.WorkingTarget = {};
}
},
init() {
if (!Memory.Task) {
Memory.Task = {};
}
Memory.Task.HighPorioty = [];
Memory.Task.LowPorioty = [];
// WorkingTarget是被跟踪物可以是一个structure、energy、constructionSite也可以是一个creep
if (!Memory.WorkingTarget) {
Memory.WorkingTarget = {};
}
},
};

693
main.js
View File

@ -7,396 +7,411 @@ const init = require("./init");
const util = require("./utils");
function extra() {
// Game.map.visual.circle(Game.getObjectById('5bbcaaeb9099fc012e6326f1').pos)
// console.log(Game.getObjectById('5f953aa1ad1f54190745a9c3').pos)
// Memory.WorkingTarget.CONSTRUCTION_5f952fea10782b5f4ec3690a.working_creep_names=[]
// Game.map.visual.circle(Game.getObjectById('5bbcaaeb9099fc012e6326f1').pos)
// console.log(Game.getObjectById('5f953aa1ad1f54190745a9c3').pos)
// Memory.WorkingTarget.CONSTRUCTION_5f952fea10782b5f4ec3690a.working_creep_names=[]
}
function cleanCreeps() {
_.each(Object.keys(Memory.creeps), function (key) {
if (!Game.creeps[key]) {
console.log(`${key} is invalid, removed from Memory.creeps`);
delete Memory.creeps[key];
}
});
_.each(Object.keys(Memory.creeps), function (key) {
if (!Game.creeps[key]) {
console.log(`${key} is invalid, removed from Memory.creeps`);
delete Memory.creeps[key];
}
});
}
function cleanInvalidMemoryCreep() {
// 清理Memory中已经不存在的creep
_.each(Memory.WorkingTarget, function (target) {
_.remove(target.working_creep_names, function (creep_name) {
if (!Game.creeps[creep_name]) {
console.log(
`${creep_name} is invalid, removed from working_creep_names`
);
return true;
}
return false;
// 清理Memory中已经不存在的creep
_.each(Memory.WorkingTarget, function (target) {
_.remove(target.working_creep_names, function (creep_name) {
if (!Game.creeps[creep_name]) {
console.log(
`${creep_name} is invalid, removed from working_creep_names`
);
return true;
}
return false;
});
});
});
}
function cleanTargetMemory() {
_.each(Object.keys(Memory.WorkingTarget), function (target) {
if (!Game.getObjectById(target.id)) {
console.log(
`target ${target.id} is invalid, removed from Memory.WorkingTarget.Set their creep to idle`
);
_.each(target.working_creep_names, (creep_name) => {
Game.creeps[creep_name].working_target_id = undefined;
});
delete Memory.WorkingTarget[i];
}
});
_.each(Object.keys(Memory.WorkingTarget), function (target) {
if (!Game.getObjectById(target.id)) {
console.log(
`target ${target.id} is invalid, removed from Memory.WorkingTarget.Set their creep to idle`
);
_.each(target.working_creep_names, (creep_name) => {
Game.creeps[creep_name].working_target_id = undefined;
});
delete Memory.WorkingTarget[i];
}
});
}
function assign_creeps(opt) {
const { memory } = opt;
const { creep_name_to_assign_array } = opt; // 需要分配工作的creeps
_.each(creep_name_to_assign_array, function (creep_name) {
// 先计算每一个target目前有多少个creeps了
const working_creeps_of_target_array = []; // 记录每个target已有的creep数量
_.each(memory, (m) =>
working_creeps_of_target_array.push(m.working_creep_names.length)
);
const target_to_add_creep = _.filter(
memory,
(m) =>
m.working_creep_names.length === _.min(working_creeps_of_target_array)
); // 选择目前已有creep最少的对其添加creep
if (target_to_add_creep.length > 0) {
target_to_add_creep[0].working_creep_names.push(creep_name); // target记录自己安排的creep
Game.creeps[creep_name].working_target_id = target_to_add_creep[0].id; // 将target安排给creep
}
});
const { memory } = opt;
const { creep_name_to_assign_array } = opt; // 需要分配工作的creeps
_.each(creep_name_to_assign_array, function (creep_name) {
// 先计算每一个target目前有多少个creeps了
const working_creeps_of_target_array = []; // 记录每个target已有的creep数量
_.each(memory, (m) =>
working_creeps_of_target_array.push(m.working_creep_names.length)
);
const target_to_add_creep = _.filter(
memory,
(m) =>
m.working_creep_names.length ===
_.min(working_creeps_of_target_array)
); // 选择目前已有creep最少的对其添加creep
if (target_to_add_creep.length > 0) {
target_to_add_creep[0].working_creep_names.push(creep_name); // target记录自己安排的creep
Game.creeps[creep_name].working_target_id =
target_to_add_creep[0].id; // 将target安排给creep
}
});
}
function assign_transfer(target_memory) {
const NO_IDLE_TRANSFER = -1;
const OK_TRANSFER = 0;
const MEMORY_EMPTY = -2;
if (target_memory.length > 0) {
const idle_transfer = _.filter(
Game.creeps,
(creep) => !creep.working_target_id && creep.memory.role === "transfer"
);
if (idle_transfer.length > 0) {
// 一次只安排一个creep
const opt = {
memory: target_memory,
creep_name_to_assign_array: [idle_transfer[0].name],
};
assign_creeps(opt);
return OK_TRANSFER;
const NO_IDLE_TRANSFER = -1;
const OK_TRANSFER = 0;
const MEMORY_EMPTY = -2;
if (target_memory.length > 0) {
const idle_transfer = _.filter(
Game.creeps,
(creep) =>
!creep.working_target_id && creep.memory.role === "transfer"
);
if (idle_transfer.length > 0) {
// 一次只安排一个creep
const opt = {
memory: target_memory,
creep_name_to_assign_array: [idle_transfer[0].name],
};
assign_creeps(opt);
return OK_TRANSFER;
}
return NO_IDLE_TRANSFER;
}
return NO_IDLE_TRANSFER;
}
return MEMORY_EMPTY;
return MEMORY_EMPTY;
}
// TODO:应该和assign_transfer_to_builder合并
function assign_transfer_to_harvester() {
// 判断有多少个picker的transfer为0
const harvester_without_creep = _.filter(Game.creeps, function (creep) {
return (
!Memory.WorkingTarget[creep.name] && creep.memory.role === "harvester"
); // Memory.WorkingTarget中没有这个harvester目标
});
_.each(harvester_without_creep, function (harvester_creep) {
Memory.WorkingTarget[harvester_creep.name] = {
id: harvester_creep.id,
working_creep_names: [],
cate: "harvester",
}; // 在Memory.WorkingTarget加入需要creep的Picker
});
const harvester_needs_creep_memory = _.filter(
Memory.WorkingTarget,
(memory) =>
memory.working_creep_names.length === 0 && memory.cate === "harvester"
); // 需要安排creep的harvester
assign_transfer(harvester_needs_creep_memory);
// 判断有多少个picker的transfer为0
const harvester_without_creep = _.filter(Game.creeps, function (creep) {
return (
!Memory.WorkingTarget[creep.name] &&
creep.memory.role === "harvester"
); // Memory.WorkingTarget中没有这个harvester目标
});
_.each(harvester_without_creep, function (harvester_creep) {
Memory.WorkingTarget[harvester_creep.name] = {
id: harvester_creep.id,
working_creep_names: [],
cate: "harvester",
}; // 在Memory.WorkingTarget加入需要creep的Picker
});
const harvester_needs_creep_memory = _.filter(
Memory.WorkingTarget,
(memory) =>
memory.working_creep_names.length === 0 &&
memory.cate === "harvester"
); // 需要安排creep的harvester
assign_transfer(harvester_needs_creep_memory);
}
function assign_task() {
_.each(Object.keys(Game.creeps), (creep_name) => {
const creep = Game.creeps[creep_name];
creep.action();
});
_.each(Object.keys(Game.creeps), (creep_name) => {
const creep = Game.creeps[creep_name];
creep.action();
});
}
function createBuilderCreep() {
// create new creep
const new_creep_name = `AUTO_CREATE_Builder_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, WORK],
new_creep_name
);
if (Re_code === new_creep_name) {
Game.creeps[new_creep_name].memory.role = "builder";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create builder with code ${Re_code}`);
}
// create new creep
const new_creep_name = `AUTO_CREATE_Builder_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, WORK],
new_creep_name
);
if (Re_code === new_creep_name) {
Game.creeps[new_creep_name].memory.role = "builder";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create builder with code ${Re_code}`);
}
}
function assign_transfer_to_builder() {
// 判断有多少个builder的transfer为0
const builder_without_creep = _.filter(Game.creeps, function (creep) {
return !Memory.WorkingTarget[creep.name] && creep.memory.role === "builder"; // Memory.WorkingTarget中没有这个builder目标
});
_.each(builder_without_creep, function (builder) {
Memory.WorkingTarget[builder.name] = {
id: builder.id,
working_creep_names: [],
cate: "builder",
}; // 在Memory.WorkingTarget加入需要creep的builder
});
const builder_needs_creep_memory = _.filter(
Memory.WorkingTarget,
(memory) =>
memory.working_creep_names.length === 0 && memory.cate === "builder"
); // 需要安排creep的builder
if (assign_transfer(builder_needs_creep_memory) === -1) {
console.log(
`no enough transfer to builder. Try to create a new one autmatically`
);
createBuilderCreep();
}
// 判断有多少个builder的transfer为0
const builder_without_creep = _.filter(Game.creeps, function (creep) {
return (
!Memory.WorkingTarget[creep.name] && creep.memory.role === "builder"
); // Memory.WorkingTarget中没有这个builder目标
});
_.each(builder_without_creep, function (builder) {
Memory.WorkingTarget[builder.name] = {
id: builder.id,
working_creep_names: [],
cate: "builder",
}; // 在Memory.WorkingTarget加入需要creep的builder
});
const builder_needs_creep_memory = _.filter(
Memory.WorkingTarget,
(memory) =>
memory.working_creep_names.length === 0 && memory.cate === "builder"
); // 需要安排creep的builder
if (assign_transfer(builder_needs_creep_memory) === -1) {
console.log(
`no enough transfer to builder. Try to create a new one autmatically`
);
createBuilderCreep();
}
}
function assign_builder_to_construction(construction_id) {
// 检查construction是否已经是target
const constuction_key = `CONSTRUCTION_${construction_id}`;
if (
!_.find(Memory.WorkingTarget, (target) => target.id === construction_id)
) {
Memory.WorkingTarget[constuction_key] = {
id: construction_id,
working_creep_names: [],
cate: "constuction_site",
};
}
// 安排一个builder过去
const builder = _.filter(
Game.creeps,
(creep) => creep.memory.role === "builder" && !creep.working_target_id
);
if (builder.length > 0) {
const opt = {
memory: _.filter(
Memory.WorkingTarget,
(_memory) =>
_memory.working_creep_names.length === 0 &&
_memory.cate === "constuction_site"
),
creep_name_to_assgin_array: [builder[0].name],
};
assign_creeps(opt);
} else {
console.log(
`no enough builder to constuction_site ${construction_id}. Try to create a new one autmatically`
// 检查construction是否已经是target
const constuction_key = `CONSTRUCTION_${construction_id}`;
if (
!_.find(Memory.WorkingTarget, (target) => target.id === construction_id)
) {
Memory.WorkingTarget[constuction_key] = {
id: construction_id,
working_creep_names: [],
cate: "constuction_site",
};
}
// 安排一个builder过去
const builder = _.filter(
Game.creeps,
(creep) => creep.memory.role === "builder" && !creep.working_target_id
);
createBuilderCreep();
}
// //开始给建造constrction的每个creep安排transfer
// _.each(Memory.WorkingTarget[constuction_key].working_creep_names,function(builder_creep_name){
// if(!Memory.WorkingTarget[builder_creep_name]){
// Memory.WorkingTarget[builder_creep_name]={id:Game.creeps[builder_creep_name].id,working_creep_names: [], cate: 'builder'}
// }
// })
if (builder.length > 0) {
const opt = {
memory: _.filter(
Memory.WorkingTarget,
(_memory) =>
_memory.working_creep_names.length === 0 &&
_memory.cate === "constuction_site"
),
creep_name_to_assgin_array: [builder[0].name],
};
assign_creeps(opt);
} else {
console.log(
`no enough builder to constuction_site ${construction_id}. Try to create a new one autmatically`
);
createBuilderCreep();
}
// //开始给建造constrction的每个creep安排transfer
// _.each(Memory.WorkingTarget[constuction_key].working_creep_names,function(builder_creep_name){
// if(!Memory.WorkingTarget[builder_creep_name]){
// Memory.WorkingTarget[builder_creep_name]={id:Game.creeps[builder_creep_name].id,working_creep_names: [], cate: 'builder'}
// }
// })
}
function assign_harvester_to_enery_source() {
const sources = Game.spawns.Spawn1.room.find(FIND_SOURCES_ACTIVE);
const all_memory = Memory.WorkingTarget;
_.each(Object.keys(sources), function (source) {
const { id } = source;
const key = `Energy_${id}`;
if (!Memory.WorkingTarget[key]) {
Memory.WorkingTarget[key] = {
id,
working_creep_names: [],
cate: "ENERGY_SOURCE",
};
}
});
// 向Memory.WorkingTarget里添加所有的Energy Source
// 寻找Energy Source的Memory
const energy_memory = _.filter(all_memory, { cate: "ENERGY_SOURCE" });
// 寻找creep为0的energy source
const energy_source_need_creep_array = _.filter(
energy_memory,
(m) => m.working_creep_names.length === 0
);
if (energy_source_need_creep_array.length > 0) {
// 找到一个空闲的creep
const available_creep_array = _.filter(
Game.creeps,
(creep) => !creep.working_target_id && creep.memory.role === "harvester"
const sources = Game.spawns.Spawn1.room.find(FIND_SOURCES_ACTIVE);
const all_memory = Memory.WorkingTarget;
_.each(Object.keys(sources), function (source) {
const { id } = source;
const key = `Energy_${id}`;
if (!Memory.WorkingTarget[key]) {
Memory.WorkingTarget[key] = {
id,
working_creep_names: [],
cate: "ENERGY_SOURCE",
};
}
});
// 向Memory.WorkingTarget里添加所有的Energy Source
// 寻找Energy Source的Memory
const energy_memory = _.filter(all_memory, { cate: "ENERGY_SOURCE" });
// 寻找creep为0的energy source
const energy_source_need_creep_array = _.filter(
energy_memory,
(m) => m.working_creep_names.length === 0
);
if (available_creep_array.length > 0) {
// 每次只安排一个
const opt = {
memory: energy_memory,
creep_name_to_assign_array: [available_creep_array[0].name],
};
assign_creeps(opt);
if (energy_source_need_creep_array.length > 0) {
// 找到一个空闲的creep
const available_creep_array = _.filter(
Game.creeps,
(creep) =>
!creep.working_target_id && creep.memory.role === "harvester"
);
if (available_creep_array.length > 0) {
// 每次只安排一个
const opt = {
memory: energy_memory,
creep_name_to_assign_array: [available_creep_array[0].name],
};
assign_creeps(opt);
}
}
}
}
function assign_builder_to_controller() {
// 如果存在正在建造的construction且没有多余的builder就暂停upgrade controller
if (Game.spawns.Spawn1.room.find(FIND_MY_CONSTRUCTION_SITES).length > 0) {
const working_builder = _.filter(
Game.creeps,
(creep) => creep.memory.role === "builder" && !creep.working_target_id
);
if (working_builder.length === 0) {
// 没有可以用的builder了
const controller_id = Game.spawns.Spawn1.room.controller.id;
const controller_memory =
Memory.WorkingTarget[`RoomController_${controller_id}`];
if (controller_memory) {
_.each(controller_memory.working_creep_names, (creep_name) => {
Game.creeps[creep_name].working_target_id = 0;
});
memory.working_creep_names = [];
return;
}
// 如果存在正在建造的construction且没有多余的builder就暂停upgrade controller
if (Game.spawns.Spawn1.room.find(FIND_MY_CONSTRUCTION_SITES).length > 0) {
const working_builder = _.filter(
Game.creeps,
(creep) =>
creep.memory.role === "builder" && !creep.working_target_id
);
if (working_builder.length === 0) {
// 没有可以用的builder了
const controller_id = Game.spawns.Spawn1.room.controller.id;
const controller_memory =
Memory.WorkingTarget[`RoomController_${controller_id}`];
if (controller_memory) {
_.each(controller_memory.working_creep_names, (creep_name) => {
Game.creeps[creep_name].working_target_id = 0;
});
memory.working_creep_names = [];
return;
}
}
}
}
// 判断room controller 是否有creep,没有则添加
if (
!_.find(
Memory.WorkingTarget,
(target) => target.id === Game.spawns.Spawn1.room.controller.id
)
) {
Memory.WorkingTarget[
`RoomController_${Game.spawns.Spawn1.room.controller.id}`
] = {
id: Game.spawns.Spawn1.room.controller.id,
working_creep_names: [],
cate: "ROOM_CONTROLLER",
};
}
const room_controller_mem = _.filter(Memory.WorkingTarget, {
cate: "ROOM_CONTROLLER",
});
// 寻找creep为0的room controller
const room_controller_need_creep_array = _.filter(
room_controller_mem,
(m) => m.working_creep_names.length === 0 && m.cate === "ROOM_CONTROLLER"
);
if (room_controller_need_creep_array.length > 0) {
const builder_creep = _.filter(
Game.creeps,
(creep) => !creep.working_target_id && creep.memory.role === "builder"
);
if (builder_creep.length > 0) {
const opt = {
memory: room_controller_mem,
creep_name_to_assign_array: [builder_creep[0].name],
};
assign_creeps(opt);
// 判断room controller 是否有creep,没有则添加
if (
!_.find(
Memory.WorkingTarget,
(target) => target.id === Game.spawns.Spawn1.room.controller.id
)
) {
Memory.WorkingTarget[
`RoomController_${Game.spawns.Spawn1.room.controller.id}`
] = {
id: Game.spawns.Spawn1.room.controller.id,
working_creep_names: [],
cate: "ROOM_CONTROLLER",
};
}
const room_controller_mem = _.filter(Memory.WorkingTarget, {
cate: "ROOM_CONTROLLER",
});
// 寻找creep为0的room controller
const room_controller_need_creep_array = _.filter(
room_controller_mem,
(m) =>
m.working_creep_names.length === 0 && m.cate === "ROOM_CONTROLLER"
);
if (room_controller_need_creep_array.length > 0) {
const builder_creep = _.filter(
Game.creeps,
(creep) =>
!creep.working_target_id && creep.memory.role === "builder"
);
if (builder_creep.length > 0) {
const opt = {
memory: room_controller_mem,
creep_name_to_assign_array: [builder_creep[0].name],
};
assign_creeps(opt);
}
}
}
}
function createHarvestCreep() {
// create new creep
const new_creep_name = `AUTO_CREATE_Harvester_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, WORK],
new_creep_name
);
if (Re_code === new_creep_name) {
Game.creeps[new_creep_name].memory.role = "harvester";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create harvester with code ${Re_code}`);
}
// create new creep
const new_creep_name = `AUTO_CREATE_Harvester_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, WORK],
new_creep_name
);
if (Re_code === new_creep_name) {
Game.creeps[new_creep_name].memory.role = "harvester";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create harvester with code ${Re_code}`);
}
}
function createTransferCreep() {
// create new creep
const new_creep_name = `AUTO_CREATE_Transfer_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, CARRY],
new_creep_name
);
if (new_creep_name === Re_code) {
Game.creeps[new_creep_name].memory.role = "transfer";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create transfer with code ${Re_code}`);
}
// create new creep
const new_creep_name = `AUTO_CREATE_Transfer_${util.uuid()}`;
const Re_code = Game.spawns.Spawn1.createCreep(
[MOVE, CARRY, CARRY],
new_creep_name
);
if (new_creep_name === Re_code) {
Game.creeps[new_creep_name].memory.role = "transfer";
console.log(`Create new creep ${new_creep_name}`);
} else {
// console.log(`failed to create transfer with code ${Re_code}`);
}
}
module.exports.loop = function _() {
extra();
init.init();
mount.mount();
cleanCreeps();
cleanInvalidMemoryCreep();
cleanTargetMemory();
assign_harvester_to_enery_source();
assign_transfer_to_harvester();
assign_builder_to_controller();
assign_transfer_to_builder();
const construction_site_array = Game.spawns.Spawn1.room.find(
FIND_MY_CONSTRUCTION_SITES
);
_.each(construction_site_array, function (found_construction_site) {
const constuction_key = `CONSTRUCTION_${found_construction_site.id}`;
if (
Memory.WorkingTarget[constuction_key] &&
Memory.WorkingTarget[constuction_key].working_creep_names.length === 0
) {
assign_builder_to_construction(found_construction_site.id);
extra();
init.init();
mount.mount();
cleanCreeps();
cleanInvalidMemoryCreep();
cleanTargetMemory();
assign_harvester_to_enery_source();
assign_transfer_to_harvester();
assign_builder_to_controller();
assign_transfer_to_builder();
const construction_site_array = Game.spawns.Spawn1.room.find(
FIND_MY_CONSTRUCTION_SITES
);
_.each(construction_site_array, function (found_construction_site) {
const constuction_key = `CONSTRUCTION_${found_construction_site.id}`;
if (
Memory.WorkingTarget[constuction_key] &&
Memory.WorkingTarget[constuction_key].working_creep_names.length ===
0
) {
assign_builder_to_construction(found_construction_site.id);
}
});
let isSpawning = false;
const energy_source_number = _.filter(
Game.spawns.Spawn1.room.find(FIND_SOURCES_ACTIVE)
).length;
const harvester_number = _(Game.creeps)
.filter({ memory: { role: "harvester" } })
.size();
if (!Game.spawns.Spawn1.spawning) {
if (harvester_number < energy_source_number) {
isSpawning = true;
createHarvestCreep();
}
if (
_(Game.creeps)
.filter({ memory: { role: "transfer" } })
.size() < energy_source_number &&
!isSpawning
) {
isSpawning = true;
createTransferCreep();
}
const builder_number = _.filter(Game.creeps, {
memory: { role: "builder" },
}).length;
// 创造一个builder升级room controller
if (
Game.spawns.Spawn1.room.controller &&
builder_number < 1 + construction_site_array.length &&
!isSpawning
) {
isSpawning = true;
createBuilderCreep();
}
// 判断是否需要再增加1个transfer
const transfer_number = _.filter(Game.creeps, {
memory: { role: "transfer" },
}).length;
if (
builder_number + harvester_number > transfer_number &&
!isSpawning
) {
isSpawning = true;
createTransferCreep();
}
}
});
let isSpawning = false;
const energy_source_number = _.filter(
Game.spawns.Spawn1.room.find(FIND_SOURCES_ACTIVE)
).length;
const harvester_number = _(Game.creeps)
.filter({ memory: { role: "harvester" } })
.size();
if (!Game.spawns.Spawn1.spawning) {
if (harvester_number < energy_source_number) {
isSpawning = true;
createHarvestCreep();
}
if (
_(Game.creeps)
.filter({ memory: { role: "transfer" } })
.size() < energy_source_number &&
!isSpawning
) {
isSpawning = true;
createTransferCreep();
}
const builder_number = _.filter(Game.creeps, {
memory: { role: "builder" },
}).length;
// 创造一个builder升级room controller
if (
Game.spawns.Spawn1.room.controller &&
builder_number < 1 + construction_site_array.length &&
!isSpawning
) {
isSpawning = true;
createBuilderCreep();
}
// 判断是否需要再增加1个transfer
const transfer_number = _.filter(Game.creeps, {
memory: { role: "transfer" },
}).length;
if (builder_number + harvester_number > transfer_number && !isSpawning) {
isSpawning = true;
createTransferCreep();
}
}
assign_task();
assign_task();
};

View File

@ -7,41 +7,41 @@ const transfer = require("./transfer");
const builder = require("./builder");
function action() {
const { role } = this.memory;
// this.say(`${role}`);
switch (role) {
case "harvester":
harvester.run(this);
break;
case "transfer":
transfer.run(this);
break;
case "builder":
builder.run(this);
break;
default:
break;
}
const { role } = this.memory;
// this.say(`${role}`);
switch (role) {
case "harvester":
harvester.run(this);
break;
case "transfer":
transfer.run(this);
break;
case "builder":
builder.run(this);
break;
default:
break;
}
}
module.exports = {
mount() {
Creep.prototype.action = action;
if (!Creep.prototype.hasOwnProperty("working_target_id")) {
Object.defineProperty(Creep.prototype, "working_target_id", {
get() {
return this.memory.working_target_id;
},
set(id) {
this.memory.working_target_id = id;
},
});
}
Game.cwt = function (creep_name) {
Game.creeps[creep_name].working_target_id = undefined;
};
Game.pos = function (id) {
console.log(Game.getObjectById(id));
};
},
mount() {
Creep.prototype.action = action;
if (!Creep.prototype.hasOwnProperty("working_target_id")) {
Object.defineProperty(Creep.prototype, "working_target_id", {
get() {
return this.memory.working_target_id;
},
set(id) {
this.memory.working_target_id = id;
},
});
}
Game.cwt = function (creep_name) {
Game.creeps[creep_name].working_target_id = undefined;
};
Game.pos = function (id) {
console.log(Game.getObjectById(id));
};
},
};

View File

@ -1,3 +1,3 @@
module.exports = {
visualPath(my_pos, target_pos) {},
visualPath(my_pos, target_pos) {},
};

10
task.js
View File

@ -1,9 +1,5 @@
const { memory } = require("console")
const { memory } = require("console");
module.exports = {
upgradeController(){
}
}
upgradeController() {},
};

View File

@ -1,3 +1,3 @@
a= undefined || {a:'a'}
a = undefined || { a: "a" };
console.log(a)
console.log(a);

View File

@ -7,77 +7,82 @@ const path = require("./path");
// const harvester = require("./harvester");
module.exports = {
run(creep) {
creep.say("tf");
const { working_target_id } = creep;
if (!working_target_id) {
creep.say("SB");
return;
}
const working_target = Game.getObjectById(working_target_id);
// TODO:处理transfer的对象消失的情况
if (!working_target) {
// _.each(Memery.WorkingTarget[creep.name].working_creep_names,creep_name=>Game.creeps[creep_name].working_target_id=undefined)
// delete Memery.WorkingTarget[creep.name]
return;
}
const working_target_pos = working_target.pos;
const my_pos = creep.pos;
if (!working_target.memory) {
console.log(
`check ${creep.name}, working target memory ${JSON.stringify(
working_target
)}`
);
return;
}
if (working_target.memory.role === "harvester") {
if (creep.store.energy < creep.store.getCapacity()) {
run(creep) {
creep.say("tf");
const { working_target_id } = creep;
if (!working_target_id) {
creep.say("SB");
return;
}
const working_target = Game.getObjectById(working_target_id);
// TODO:处理transfer的对象消失的情况
if (!working_target) {
// console.log(`${creep.name} working target vanished. Turn to unassigned.`)
return;
// _.each(Memery.WorkingTarget[creep.name].working_creep_names,creep_name=>Game.creeps[creep_name].working_target_id=undefined)
// delete Memery.WorkingTarget[creep.name]
return;
}
if (utils.distance(working_target_pos, my_pos) > 1.5) {
// 在附近就是1或者1.414
creep.moveTo(working_target_pos, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, working_target_pos);
} else {
// find dropped source
const found = creep.room.lookForAt(LOOK_ENERGY, working_target_pos);
if (found.length > 0) {
creep.pickup(found[0]);
}
const working_target_pos = working_target.pos;
const my_pos = creep.pos;
if (!working_target.memory) {
console.log(
`check ${creep.name}, working target memory ${JSON.stringify(
working_target
)}`
);
return;
}
} else if (
creep.transfer(Game.spawns.Spawn1, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
}
if (working_target.memory.role === "builder") {
if (creep.store.energy > 0) {
if (utils.distance(working_target_pos, my_pos) > 1.5) {
// 在附近就是1或者1.414
creep.moveTo(working_target_pos, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, working_target_pos);
} else {
creep.drop(RESOURCE_ENERGY);
if (working_target.memory.role === "harvester") {
if (creep.store.energy < creep.store.getCapacity()) {
if (!working_target) {
// console.log(`${creep.name} working target vanished. Turn to unassigned.`)
return;
}
if (utils.distance(working_target_pos, my_pos) > 1.5) {
// 在附近就是1或者1.414
creep.moveTo(working_target_pos, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, working_target_pos);
} else {
// find dropped source
const found = creep.room.lookForAt(
LOOK_ENERGY,
working_target_pos
);
if (found.length > 0) {
creep.pickup(found[0]);
}
}
} else if (
creep.transfer(Game.spawns.Spawn1, RESOURCE_ENERGY) ===
ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
}
} else if (
creep.withdraw(Game.spawns.Spawn1, RESOURCE_ENERGY) === ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
}
},
if (working_target.memory.role === "builder") {
if (creep.store.energy > 0) {
if (utils.distance(working_target_pos, my_pos) > 1.5) {
// 在附近就是1或者1.414
creep.moveTo(working_target_pos, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, working_target_pos);
} else {
creep.drop(RESOURCE_ENERGY);
}
} else if (
creep.withdraw(Game.spawns.Spawn1, RESOURCE_ENERGY) ===
ERR_NOT_IN_RANGE
) {
creep.moveTo(Game.spawns.Spawn1, {
visualizePathStyle: { stroke: "#ffffff" },
});
path.visualPath(creep.pos, Game.spawns.Spawn1.pos);
}
}
},
};

View File

@ -1,23 +1,23 @@
module.exports = {
uuid() {
// 6位
let uuid = "";
for (let i = 0; i < 6; i += 1) {
if (Math.random() > 0.5) {
// 大于0.5就是数字,小于则是字母
uuid += Math.round(Math.random() * 100) % 10;
} else {
uuid += String.fromCharCode(
97 + (Math.round(Math.random() * 100) % 26)
);
}
}
return uuid;
},
distance(pos1, pos2) {
if (pos1.roomName === pos2.roomName) {
return Math.sqrt((pos1.x - pos2.x, 2) ** 2);
}
return -1; // 如果不在一个房间内,就返回负数。
},
uuid() {
// 6位
let uuid = "";
for (let i = 0; i < 6; i += 1) {
if (Math.random() > 0.5) {
// 大于0.5就是数字,小于则是字母
uuid += Math.round(Math.random() * 100) % 10;
} else {
uuid += String.fromCharCode(
97 + (Math.round(Math.random() * 100) % 26)
);
}
}
return uuid;
},
distance(pos1, pos2) {
if (pos1.roomName === pos2.roomName) {
return Math.sqrt((pos1.x - pos2.x, 2) ** 2);
}
return -1; // 如果不在一个房间内,就返回负数。
},
};