From 27750dbc53e2140b5f843e5e0dc9b07248a85b63 Mon Sep 17 00:00:00 2001 From: facat Date: Mon, 26 Oct 2020 12:58:15 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8Dbug=E3=80=822.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0assign=5Ftransfer=E5=87=BD=E6=95=B0=EF=BC=8C=E7=B2=BE?= =?UTF-8?q?=E7=AE=80=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- builder.js | 94 ++++++++++++++++++++++------- harvester.js | 9 ++- main.js | 167 +++++++++++++++++++++++++++++++++------------------ mount.js | 6 ++ picker.js | 23 ------- task.js | 6 +- test.js | 42 +------------ transfer.js | 7 ++- 8 files changed, 201 insertions(+), 153 deletions(-) delete mode 100644 picker.js diff --git a/builder.js b/builder.js index 8cc995e..5aead99 100644 --- a/builder.js +++ b/builder.js @@ -1,30 +1,82 @@ -const utils = require('utils') +const utils = require('utils'); module.exports = { run(creep) { - creep.say('builder') if (creep.working_target_id) { let working_target_id = creep.working_target_id; let working_target = Game.getObjectById(working_target_id); - if (utils.distance(creep.pos, working_target.pos) > 1.5) { - creep.moveTo(working_target); - } else { - let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES) - let 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) { - let Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]); - if (OK == Re_code_pickup) { - //TODO:需要适应不同的建筑 - let Re_code = creep.upgradeController(working_target) - 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}`) - } - } - } - + 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') } } +} + + +function upgradeController_job(creep) { + let working_target_id = creep.working_target_id; + let working_target = Game.getObjectById(working_target_id); + if (utils.distance(creep.pos, working_target.pos) > 1.5) { + creep.moveTo(working_target); + } else { + let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES) + let 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) { + let Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]); + if (OK == Re_code_pickup || ERR_FULL == Re_code_pickup) { + //TODO:需要适应不同的建筑 + let Re_code = creep.upgradeController(working_target) + 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}`) + } + } + + } +} + + +function build_construction(creep) { + let working_target_id = creep.working_target_id; + let working_target = Game.getObjectById(working_target_id); + if (utils.distance(creep.pos, working_target.pos) > 1.5) { + creep.moveTo(working_target); + } else { + let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES) + let 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) { + let Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]); + if (OK == Re_code_pickup || ERR_FULL == Re_code_pickup) { + //TODO:需要适应不同的建筑 + let Re_code = creep.build(working_target) + 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}`) + } + } + + } } \ No newline at end of file diff --git a/harvester.js b/harvester.js index 7d12cef..9434262 100644 --- a/harvester.js +++ b/harvester.js @@ -4,11 +4,11 @@ module.exports = { let status = change_status() switch (status) { case 'harvester': - creep.say('harvester') + creep.say('hv') harvester_job(creep) break case 'picker': - creep.say('picker') + creep.say('pc') picker_job(creep) break } @@ -17,7 +17,6 @@ module.exports = { function harvester_job(creep) { - //分配source if (creep.carry.energy < creep.carryCapacity) { let working_target_id = creep.working_target_id; let working_target = Game.getObjectById(working_target_id); @@ -35,12 +34,12 @@ function harvester_job(creep) { function picker_job(creep) { if (Game.spawns['Spawn1'].store.getFreeCapacity(RESOURCE_ENERGY) == 0) { - creep.say('Standby.') + creep.say('SB') return } let working_target_id = creep.working_target_id; if (!working_target_id) { - creep.say('Standby.') + creep.say('SB') } let working_target = Game.getObjectById(working_target_id); let Re_code = creep.harvest(working_target); diff --git a/main.js b/main.js index e098e19..5069071 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,14 @@ module.exports.loop = function () { assign_transfer_to_harvester() assign_builder_to_controller(); assign_transfer_to_builder(); + let construction_site_array = Game.spawns['Spawn1'].room.find(FIND_MY_CONSTRUCTION_SITES) + _.each(construction_site_array, function (found_construction_site) { + let 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 let energy_source_number = _.filter(Game.spawns['Spawn1'].room.find(FIND_SOURCES_ACTIVE)).length; let harvester_number = _(Game.creeps).filter({ memory: { role: 'harvester' } }).size(); @@ -26,7 +34,7 @@ module.exports.loop = function () { } let builder_number = _.filter(Game.creeps, { memory: { role: 'builder' } }).length //创造一个builder升级room controller - if (Game.spawns['Spawn1'].room.controller && builder_number == 0 && !isSpawning) { + if (Game.spawns['Spawn1'].room.controller && builder_number < (1 + construction_site_array.length) && !isSpawning) { isSpawning = true createBuilderCreep(); } @@ -42,9 +50,10 @@ module.exports.loop = function () { } -function extra(){ - // Game.map.visual.circle(Game.getObjectById('5f9423c48004fbeff0f4d965').pos) - // console.log(Game.getObjectById('5f9423c48004fbeff0f4d965').pos) +function extra() { + // Game.map.visual.circle(Game.getObjectById('5bbcaaeb9099fc012e6326f1').pos) + // console.log(Game.getObjectById('5f953aa1ad1f54190745a9c3').pos) + // Memory.WorkingTarget.CONSTRUCTION_5f952fea10782b5f4ec3690a.working_creep_names=[] } function cleanCreeps() { @@ -56,36 +65,61 @@ function cleanCreeps() { } } +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 + + }) + }) +} + function cleanTargetMemory() { for (let i of Object.keys(Memory.WorkingTarget)) { let target = Memory.WorkingTarget[i] if (!Game.getObjectById(target.id)) { - console.log(`target ${target.id} is invalid, removed from Memory.WorkingTarget`) + console.log(`target ${target.id} is invalid, removed from Memory.WorkingTarget.Set their creep to idle`) + _.each(Memory.WorkingTarget[i].working_creep_names, creep_name => creep_name.working_target_id = undefined) delete Memory.WorkingTarget[i]; } } } +function assign_transfer(target_memory) { + const NO_IDLE_TRANSFER = -1 + const OK_TRANSFER = 0 + if (target_memory.length > 0) { + let idle_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) + if (idle_transfer.length > 0) {//一次只安排一个creep + let opt = { + memory: target_memory, + creep_name_to_assign_array: [idle_transfer[0].name] + } + assign_creeps(opt) + return OK_TRANSFER + } else { + return NO_IDLE_TRANSFER + + } + } +} +//TODO:应该和assign_transfer_to_builder合并 function assign_transfer_to_harvester() { //判断有多少个picker的transfer为0 let harvester_without_creep = _.filter(Game.creeps, function (creep) { - return !Memory.WorkingTarget[creep.name] && creep.memory.role=='harvester'//Memory.WorkingTarget中没有这个picker目标 + 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 }) - let harvester_needs_creep_memory = _.filter(Memory.WorkingTarget, memory => memory.working_creep_names.length == 0 && memory.cate=='harvester') - if (harvester_needs_creep_memory.length > 0) { - let idle_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) - if (idle_transfer.length > 0) {//一次只安排一个creep - let opt = { - memory: harvester_needs_creep_memory, - creep_name_to_assgin_array: [idle_transfer[0].name] - } - assign_creeps(opt) - } - } + let 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() { @@ -96,59 +130,59 @@ function assign_task() { } + function assign_transfer_to_builder() { - //判断有多少个picker的transfer为0 + //判断有多少个builder的transfer为0 let builder_without_creep = _.filter(Game.creeps, function (creep) { - return !Memory.WorkingTarget[creep.name] && creep.memory.role=='builder'//Memory.WorkingTarget中没有这个picker目标 + 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 }) - let builder_needs_creep_memory = _.filter(Memory.WorkingTarget, memory => memory.working_creep_names.length == 0 && memory.cate=='builder') - if (builder_needs_creep_memory.length > 0) { - let idle_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) - if (idle_transfer.length > 0) {//一次只安排一个creep - let opt = { - memory: builder_needs_creep_memory, - creep_name_to_assgin_array: [idle_transfer[0].name] - } - assign_creeps(opt) - } + let 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 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 +function assign_builder_to_construction(construction_id) { + //检查construction是否已经是target + let 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过去 + let builder = _.filter(Game.creeps, creep => creep.memory.role == 'builder' && !creep.working_target_id) + if (builder.length > 0) { - }) - }) + let 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_creeps(opt) { let memory = opt.memory - let creep_name_to_assgin_array = opt.creep_name_to_assgin_array//需要分配工作的creeps - //清理Memroy中已经不存在的creep - _.each(memory, function (m) { - _.remove(m.working_creep_names, function (name) { - if (Game.creeps[name] === undefined || Game.creeps[name] === null) { - console.log(`remove ${name} from ${m.id} working_creep_names`) - return true - } - return false - }) - }) - _.each(creep_name_to_assgin_array, function (creep_name) { + let creep_name_to_assign_array = opt.creep_name_to_assign_array//需要分配工作的creeps + _.each(creep_name_to_assign_array, function (creep_name) { //先计算每一个target目前有多少个creeps了 let working_creeps_of_target_array = []//记录每个target已有的creep数量 _.each(memory, m => working_creeps_of_target_array.push(m.working_creep_names.length)) let target_to_add_creep = _.filter(memory, m => m.working_creep_names.length == _.min(working_creeps_of_target_array))//选择目前已有creep最少的,对其添加creep + console.log(target_to_add_creep.length) 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 @@ -163,7 +197,7 @@ function assign_harvester_to_enery_source() { let all_memory = Memory.WorkingTarget for (let source of sources) { let id = source.id - if (!_.find(all_memory,f => f['id'] == id)) { + if (!_.find(all_memory, f => f['id'] == id)) { all_memory[`Energy_${id}`] = { 'id': id, 'working_creep_names': [], "cate": 'ENERGY_SOURCE' }; } }//向Memory.WorkingTarget里添加所有的Energy Source @@ -177,7 +211,7 @@ function assign_harvester_to_enery_source() { if (available_creep_array.length > 0) {//每次只安排一个 let opt = { memory: energy_memory, - creep_name_to_assgin_array: [available_creep_array[0].name] + creep_name_to_assign_array: [available_creep_array[0].name] } assign_creeps(opt) } @@ -187,23 +221,35 @@ function assign_harvester_to_enery_source() { } function assign_builder_to_controller() { + //如果存在正在建造的construction,且没有多余的builder,就暂停upgrade controller + if (Game.spawns['Spawn1'].room.find(FIND_MY_CONSTRUCTION_SITES).length > 0) { + let working_builder = _.filter(Game.creeps, creep => creep.memory.role == 'builder' && !creep.working_target_id) + if (working_builder.length == 0) {//没有可以用的builder了 + let controller_id = Game.spawns['Spawn1'].room.controller.id + let 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' } } let room_controller_mem = _.filter(Memory.WorkingTarget, { cate: 'ROOM_CONTROLLER' }) //寻找creep为0的room controller - let room_controller_need_creep_array = _.filter(room_controller_mem, m => m.working_creep_names.length == 0 && m.cate=='ROOM_CONTROLLER') + let 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) { - let builder_creep = _.filter(Game.creeps, creep => !creep.working_target_id || creep.memory.role == 'builder') + let builder_creep = _.filter(Game.creeps, creep => !creep.working_target_id && creep.memory.role == 'builder') if (builder_creep.length > 0) { - let opt = { memory: room_controller_mem, - creep_name_to_assgin_array: [builder_creep[0].name] + creep_name_to_assign_array: [builder_creep[0].name] } assign_creeps(opt) - } + } } } @@ -248,4 +294,5 @@ function createBuilderCreep() { } else { // console.log(`failed to create builder with code ${Re_code}`); } -} \ No newline at end of file +} + diff --git a/mount.js b/mount.js index bb63c32..c677f88 100644 --- a/mount.js +++ b/mount.js @@ -15,6 +15,12 @@ module.exports = { } ) } + 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/picker.js b/picker.js deleted file mode 100644 index af88d84..0000000 --- a/picker.js +++ /dev/null @@ -1,23 +0,0 @@ -//只收集,不运输 -module.exports = { - run(creep) { - if(Game.spawns['Spawn1'].store.getFreeCapacity(RESOURCE_ENERGY)==0){ - creep.say('Standby.') - return - } - let working_target_id = creep.working_target_id; - let working_target = Game.getObjectById(working_target_id); - let 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); - } else { - console.log(`${creep.name} ${creep.memory.role} working target ${working_target_id}`) - console.log(`${creep.name} ${creep.memory.role} err: ${Re_code}`) - } - } - } -} \ No newline at end of file diff --git a/task.js b/task.js index b8652bc..bc004ad 100644 --- a/task.js +++ b/task.js @@ -1,5 +1,9 @@ +const { memory } = require("console") + module.exports = { upgradeController(){ } -} \ No newline at end of file +} + + diff --git a/test.js b/test.js index 6eec957..ae15bc5 100644 --- a/test.js +++ b/test.js @@ -1,41 +1,3 @@ -function Person(age, name) { - this.name = name; - this.age = age; - }; - - Object.defineProperty(Person.prototype, "age", { - get: function() { - return this._age; - }, - - // Added a few things to demonstrate additional logic on the setter - set: function(num) { - num = parseInt(num, 10); - if(num > 0) { - this._age = num; - } - } - }); +a= undefined || {a:'a'} -console.log(Person.prototype.hasOwnProperty('age')) -console.log(Person.hasOwnProperty('age')) - -if(!(Person.prototype.hasOwnProperty('age'))){ - Object.defineProperty(Person.prototype, "age", { - get: function() { - return this._age; - }, - - // Added a few things to demonstrate additional logic on the setter - set: function(num) { - num = parseInt(num, 10); - if(num > 0) { - this._age = num; - } - } - }); -} - - a= new Person(1,2) - a.name=10 - console.log(a.age) \ No newline at end of file +console.log(a) \ No newline at end of file diff --git a/transfer.js b/transfer.js index 2f05262..3e54288 100644 --- a/transfer.js +++ b/transfer.js @@ -5,16 +5,17 @@ const path = require('path') module.exports = { run(creep) { - creep.say('transfer') + creep.say('tf') let working_target_id = creep.working_target_id if(!working_target_id){ - creep.say('Standby') + creep.say('SB') return } let working_target = Game.getObjectById(working_target_id) //TODO:处理transfer的对象消失的情况 if(!working_target){ - creep.working_target_id=null + // _.each(Memery.WorkingTarget[creep.name].working_creep_names,creep_name=>Game.creeps[creep_name].working_target_id=undefined) + // delete Memery.WorkingTarget[creep.name] return } let working_target_pos = working_target.pos