1.修复了一个bug。2.基本正常运转。

This commit is contained in:
facat 2020-10-23 22:19:47 +08:00
parent 9328eee122
commit 8ee9e44e1e
4 changed files with 107 additions and 53 deletions

View File

@ -1,15 +1,30 @@
const utils=require('utils') const utils = require('utils')
module.exports = { module.exports = {
run(creep) { run(creep) {
if (creep.working_target_id) { if (creep.working_target_id) {
let working_target_id = creep.working_target_id; let working_target_id = creep.working_target_id;
let working_target = Game.getObjectById(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); creep.moveTo(working_target);
}else{ } else {
creep.pickup(RESOURCE_ENERGY); // let found = creep.room.lookForAt(LOOK_ENERGY, working_target_pos);
//TODO:需要适应不同的建筑 let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES)
creep.upgradeController(working_target); 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}`)
}
}
}
} }
} }
} }

52
main.js
View File

@ -9,7 +9,7 @@ module.exports.loop = function () {
assign_harvester_picker_to_enery_source(); assign_harvester_picker_to_enery_source();
assign_transfer_to_picker() assign_transfer_to_picker()
assign_builder_to_controller(); assign_builder_to_controller();
// assign_controller(); assign_transfer_to_builder();
let isSpawning = false let isSpawning = false
let energy_source_number = _.filter(Game.spawns['Spawn1'].room.find(FIND_SOURCES_ACTIVE)).length; let energy_source_number = _.filter(Game.spawns['Spawn1'].room.find(FIND_SOURCES_ACTIVE)).length;
let harvester_number = _(Game.creeps).filter({ memory: { role: 'harvester' } }).size(); 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) { _.each(picker_has_no_creep, function (picker) {
Memory.WorkingTarget.push({ id: picker.id, working_creep_names: [], cate: 'picker' })//在Memory.WorkingTarget加入需要creep的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) let picker_memories = _.filter(Memory.WorkingTarget, picker_memory => picker_memory.working_creep_names.length == 0)
if (picker_memories.length > 0) { if (picker_memories.length > 0) {
let available_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) 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) assign_creeps(opt)
} }
} }
} }
function assign_task() { function assign_task() {
@ -80,24 +83,31 @@ function assign_task() {
} }
function assign_controller() { function assign_transfer_to_builder() {
let builder_creep_array = _.filter(Game.creeps, { memory: { role: 'builder' } }) //判断有多少个picker的transfer为0
if (builder_creep_array.length == 0) { let all_builder = _.filter(Game.creeps, { memory: { role: 'builder' } })
return; 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) { function removeUnusedMemoryItem(memory) {
@ -243,7 +253,7 @@ function createBuilderCreep() {
//create new creep //create new creep
let new_creep_name = "AUTO_CREATE_Builder_" + util.uuid(); let new_creep_name = "AUTO_CREATE_Builder_" + util.uuid();
let Re_code; 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) { if (Re_code == new_creep_name) {
Game.creeps[new_creep_name].memory.role = 'builder'; Game.creeps[new_creep_name].memory.role = 'builder';
console.log('Create new creep name ' + new_creep_name); console.log('Create new creep name ' + new_creep_name);

View File

@ -1,6 +1,10 @@
//只收集,不运输 //只收集,不运输
module.exports = { module.exports = {
run(creep) { 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_id = creep.working_target_id;
let working_target = Game.getObjectById(working_target_id); let working_target = Game.getObjectById(working_target_id);
let Re_code = creep.harvest(working_target); let Re_code = creep.harvest(working_target);

View File

@ -1,35 +1,60 @@
const utils=require('utils') const utils = require('utils')
const path=require('path') const path = require('path')
// const harvester = require("./harvester"); // const harvester = require("./harvester");
module.exports = { module.exports = {
run(creep) { run(creep) {
if (creep.carry.energy < creep.carryCapacity) { let working_target_id = creep.working_target_id
let working_target_id=creep.working_target_id let working_target = Game.getObjectById(working_target_id)
let working_target=Game.getObjectById(working_target_id) //TODO:处理transfer的对象消失的情况
if(!working_target){ if(!working_target){
// console.log(`${creep.name} working target vanished. Turn to unassigned.`) creep.working_target_id=null
return return
} }
let working_target_pos=working_target.pos let working_target_pos = working_target.pos
let my_pos=creep.pos; let my_pos = creep.pos;
if(utils.distance(working_target_pos,my_pos)>1.5){//在附近就是1或者1.414 if (working_target.memory.role == 'picker') {
creep.moveTo(working_target_pos); if (creep.store.energy < creep.store.getCapacity()) {
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 (!working_target) {
if (creep.transfer(Game.spawns['Spawn1'], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { // console.log(`${creep.name} working target vanished. Turn to unassigned.`)
creep.moveTo(Game.spawns['Spawn1']); return
path.visualPath(creep.pos,Game.spawns['Spawn1'].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])
}
}
} 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);
}
}
}
} }
} }