diff --git a/builder.js b/builder.js index d14d4f4..3fa3fc9 100644 --- a/builder.js +++ b/builder.js @@ -1,15 +1,30 @@ -const utils=require('utils') +const utils = require('utils') module.exports = { run(creep) { 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){ + if (utils.distance(creep.pos, working_target.pos) > 1.5) { creep.moveTo(working_target); - }else{ - creep.pickup(RESOURCE_ENERGY); - //TODO:需要适应不同的建筑 - creep.upgradeController(working_target); + } else { + // let found = creep.room.lookForAt(LOOK_ENERGY, working_target_pos); + 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) { + // console.log(`${creep.name} upgrade room controller`) + } else { + console.log(`${creep.name} failed to upgrade room controller:err ${Re_code}`) + } + } + } + } } } diff --git a/main.js b/main.js index 19e71a9..fb83390 100644 --- a/main.js +++ b/main.js @@ -9,7 +9,7 @@ module.exports.loop = function () { assign_harvester_picker_to_enery_source(); assign_transfer_to_picker() assign_builder_to_controller(); - // assign_controller(); + assign_transfer_to_builder(); 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(); @@ -57,6 +57,11 @@ function assign_transfer_to_picker() { _.each(picker_has_no_creep, function (picker) { Memory.WorkingTarget.push({ id: picker.id, working_creep_names: [], cate: 'picker' })//在Memory.WorkingTarget加入需要creep的Picker }) + //先移除已经失效的creep + let picker_mem=_.filter(Memory.WorkingTarget,{cate:'picker'}) + _.each(picker_mem, function (m) { + _.remove(m.working_creep_names, creep_name => !Game.creeps[creep_name])//如果一个creep已经不存在了,就从列表中移除 + }) let picker_memories = _.filter(Memory.WorkingTarget, picker_memory => picker_memory.working_creep_names.length == 0) if (picker_memories.length > 0) { let available_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) @@ -68,8 +73,6 @@ function assign_transfer_to_picker() { assign_creeps(opt) } } - - } function assign_task() { @@ -80,24 +83,31 @@ function assign_task() { } -function assign_controller() { - let builder_creep_array = _.filter(Game.creeps, { memory: { role: 'builder' } }) - if (builder_creep_array.length == 0) { - return; +function assign_transfer_to_builder() { + //判断有多少个picker的transfer为0 + let all_builder = _.filter(Game.creeps, { memory: { role: 'builder' } }) + let builder_has_no_creep = _.filter(all_builder, function (builder) { + return !_.find(Memory.WorkingTarget, target => target.id == builder.id)//Memory.WorkingTarget中没有这个builder目标 + }) + _.each(builder_has_no_creep, function (builder) { + Memory.WorkingTarget.push({ id: builder.id, working_creep_names: [], cate: 'builder' })//在Memory.WorkingTarget加入需要creep的builder + }) + //先移除已经失效的creep + let bulder_mem=_.filter(Memory.WorkingTarget,{cate:'builder'}) + _.each(bulder_mem, function (m) { + _.remove(m.working_creep_names, creep_name => !Game.creeps[creep_name])//如果一个creep已经不存在了,就从列表中移除 + }) + let builder_memories = _.filter(Memory.WorkingTarget, builder_memory => builder_memory.working_creep_names.length == 0) + if (builder_memories.length > 0) { + let available_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) + if (available_transfer.length > 0) {//一次只安排一个creep + let opt = { + memory: builder_memories, + creep_name_to_assgin_array: [available_transfer[0].name] + } + assign_creeps(opt) + } } - let builder_creep = builder_creep_array[0] - //TODO: 不能用0来判断,否则经常不会进入判断 - if (Game.spawns['Spawn1'].room.controller && Memory.WorkingTarget && Memory.WorkingTarget.Creep && Memory.WorkingTarget.Creep.length == 0) { - Memory.WorkingTarget.Creep.push({ 'id': builder_creep.id, 'working_creep_names': [] }) - } - if (Memory.WorkingTarget.Creep.length > 0) { - let opt = {} - opt.creep_name_to_assgin_array = [builder_creep.name] - opt.memory = Memory.WorkingTarget.Creep - assign_creeps(opt) - } - - } function removeUnusedMemoryItem(memory) { @@ -243,7 +253,7 @@ function createBuilderCreep() { //create new creep let new_creep_name = "AUTO_CREATE_Builder_" + util.uuid(); let Re_code; - Re_code = Game.spawns['Spawn1'].createCreep([MOVE, WORK, WORK], new_creep_name) + 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 name ' + new_creep_name); diff --git a/picker.js b/picker.js index 154521e..af88d84 100644 --- a/picker.js +++ b/picker.js @@ -1,6 +1,10 @@ //只收集,不运输 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); diff --git a/transfer.js b/transfer.js index a3ce590..4ef26cc 100644 --- a/transfer.js +++ b/transfer.js @@ -1,35 +1,60 @@ -const utils=require('utils') -const path=require('path') +const utils = require('utils') +const path = require('path') + // const harvester = require("./harvester"); module.exports = { run(creep) { - if (creep.carry.energy < creep.carryCapacity) { - let working_target_id=creep.working_target_id - let working_target=Game.getObjectById(working_target_id) - if(!working_target){ - // console.log(`${creep.name} working target vanished. Turn to unassigned.`) - return - } - let working_target_pos=working_target.pos - let my_pos=creep.pos; - if(utils.distance(working_target_pos,my_pos)>1.5){//在附近就是1或者1.414 - creep.moveTo(working_target_pos); - path.visualPath(creep.pos,working_target_pos); - }else{ - //find dropped source - let found=creep.room.lookForAt(LOOK_ENERGY,working_target_pos); - if(found.length>0){ - creep.pickup(found[0]) - } - - } + let working_target_id = creep.working_target_id + let working_target = Game.getObjectById(working_target_id) + //TODO:处理transfer的对象消失的情况 + if(!working_target){ + creep.working_target_id=null + return + } + let working_target_pos = working_target.pos + let my_pos = creep.pos; + if (working_target.memory.role == 'picker') { + if (creep.store.energy < creep.store.getCapacity()) { - }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); + 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); + path.visualPath(creep.pos, working_target_pos); + } else { + //find dropped source + let 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']); + 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); + 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']); + path.visualPath(creep.pos, Game.spawns['Spawn1'].pos); + } + } + } + } } \ No newline at end of file