diff --git a/.eslintrc.json b/.eslintrc.json index 500c673..18c51b6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -13,7 +13,8 @@ }, "rules": { "prettier/prettier": ["error",{ - "endOfLine":"auto" + "endOfLine":"auto", + "tabWidth":4 }] }, "plugins": [ diff --git a/builder.js b/builder.js index 111c026..439e684 100644 --- a/builder.js +++ b/builder.js @@ -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"); + } + }, }; diff --git a/controller_contributer.js b/controller_contributer.js index ba7219c..2387805 100644 --- a/controller_contributer.js +++ b/controller_contributer.js @@ -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); + } + } + }, }; diff --git a/harvester.js b/harvester.js index d52b08d..9d140f7 100644 --- a/harvester.js +++ b/harvester.js @@ -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; + } + }, }; diff --git a/init.js b/init.js index be12a19..3a03bb8 100644 --- a/init.js +++ b/init.js @@ -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 = {}; + } + }, }; diff --git a/main.js b/main.js index ede8834..3be527d 100644 --- a/main.js +++ b/main.js @@ -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(); }; diff --git a/mount.js b/mount.js index d601098..e488fdd 100644 --- a/mount.js +++ b/mount.js @@ -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)); + }; + }, }; diff --git a/path.js b/path.js index e587b69..5171329 100644 --- a/path.js +++ b/path.js @@ -1,3 +1,3 @@ module.exports = { - visualPath(my_pos, target_pos) {}, + visualPath(my_pos, target_pos) {}, }; diff --git a/task.js b/task.js index bc004ad..ea1f999 100644 --- a/task.js +++ b/task.js @@ -1,9 +1,5 @@ -const { memory } = require("console") +const { memory } = require("console"); module.exports = { - upgradeController(){ - - } -} - - + upgradeController() {}, +}; diff --git a/test.js b/test.js index ae15bc5..2283535 100644 --- a/test.js +++ b/test.js @@ -1,3 +1,3 @@ -a= undefined || {a:'a'} +a = undefined || { a: "a" }; -console.log(a) \ No newline at end of file +console.log(a); diff --git a/transfer.js b/transfer.js index 962e9ac..3f0cfb4 100644 --- a/transfer.js +++ b/transfer.js @@ -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); + } + } + }, }; diff --git a/utils.js b/utils.js index 9e712c7..131dbea 100644 --- a/utils.js +++ b/utils.js @@ -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; // 如果不在一个房间内,就返回负数。 + }, };