2020-10-20 17:09:06 +08:00
|
|
|
|
const init = require('init')
|
2020-10-18 22:00:22 +08:00
|
|
|
|
const util = require('utils');
|
2020-10-23 20:55:20 +08:00
|
|
|
|
const mount = require('mount')
|
2020-10-18 22:00:22 +08:00
|
|
|
|
module.exports.loop = function () {
|
|
|
|
|
|
init.init();
|
2020-10-23 20:55:20 +08:00
|
|
|
|
mount.mount()
|
2020-10-23 22:28:40 +08:00
|
|
|
|
cleanCreeps()
|
2020-10-24 15:24:24 +08:00
|
|
|
|
cleanInvalidMemoryCreep()
|
2020-10-23 22:28:40 +08:00
|
|
|
|
cleanTargetMemory()
|
2020-10-24 15:24:24 +08:00
|
|
|
|
assign_harvester_to_enery_source();
|
2020-10-23 20:55:20 +08:00
|
|
|
|
assign_transfer_to_picker()
|
|
|
|
|
|
assign_builder_to_controller();
|
2020-10-24 15:24:24 +08:00
|
|
|
|
assign_transfer_to_builder();
|
2020-10-23 20:55:20 +08:00
|
|
|
|
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();
|
|
|
|
|
|
if (!Game.spawns['Spawn1'].spawning) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
if (harvester_number < energy_source_number) {
|
2020-10-23 20:55:20 +08:00
|
|
|
|
isSpawning = true
|
|
|
|
|
|
createHarvestCreep();
|
|
|
|
|
|
}
|
2020-10-24 15:24:24 +08:00
|
|
|
|
if (_(Game.creeps).filter({ memory: { role: 'transfer' } }).size() < energy_source_number && !isSpawning) {
|
|
|
|
|
|
isSpawning = true
|
2020-10-23 20:55:20 +08:00
|
|
|
|
createTransferCreep();
|
|
|
|
|
|
}
|
|
|
|
|
|
let builder_number = _.filter(Game.creeps, { memory: { role: 'builder' } }).length
|
|
|
|
|
|
//创造一个builder升级room controller
|
|
|
|
|
|
if (Game.spawns['Spawn1'].room.controller && builder_number == 0 && !isSpawning) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
isSpawning = true
|
2020-10-23 20:55:20 +08:00
|
|
|
|
createBuilderCreep();
|
|
|
|
|
|
}
|
|
|
|
|
|
//判断是否需要再增加1个transfer
|
|
|
|
|
|
let transfer_number = _.filter(Game.creeps, { memory: { role: 'transfer' } }).length
|
2020-10-24 15:24:24 +08:00
|
|
|
|
if ((builder_number + harvester_number) > transfer_number && !isSpawning) {
|
|
|
|
|
|
isSpawning = true
|
2020-10-18 22:00:22 +08:00
|
|
|
|
createTransferCreep();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
assign_task();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-23 20:55:20 +08:00
|
|
|
|
|
|
|
|
|
|
function cleanCreeps() {
|
|
|
|
|
|
for (let i in Memory.creeps) {
|
|
|
|
|
|
if (!Game.creeps[i]) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
console.log(`${i} is invalid, removed from Memory.creeps`)
|
2020-10-23 20:55:20 +08:00
|
|
|
|
delete Memory.creeps[i];
|
|
|
|
|
|
}
|
2020-10-18 22:00:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-24 15:24:24 +08:00
|
|
|
|
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`)
|
|
|
|
|
|
delete Memory.WorkingTarget[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-23 22:28:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-23 20:55:20 +08:00
|
|
|
|
|
|
|
|
|
|
function assign_transfer_to_picker() {
|
|
|
|
|
|
//判断有多少个picker的transfer为0
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let all_picker = _.filter(Game.creeps, { memory: { role: 'harvester' } })
|
2020-10-23 20:55:20 +08:00
|
|
|
|
let picker_has_no_creep = _.filter(all_picker, function (picker) {
|
|
|
|
|
|
return !_.find(Memory.WorkingTarget, target => target.id == picker.id)//Memory.WorkingTarget中没有这个picker目标
|
|
|
|
|
|
})
|
|
|
|
|
|
_.each(picker_has_no_creep, function (picker) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
Memory.WorkingTarget[picker.name] = { id: picker.id, working_creep_names: [], cate: 'harvester' }//在Memory.WorkingTarget加入需要creep的Picker
|
2020-10-23 20:55:20 +08:00
|
|
|
|
})
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let picker_memories = _.filter(Memory.WorkingTarget, memory => memory.working_creep_names.length == 0 && memory.cate=='harvester')
|
2020-10-23 20:55:20 +08:00
|
|
|
|
if (picker_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: picker_memories,
|
|
|
|
|
|
creep_name_to_assgin_array: [available_transfer[0].name]
|
|
|
|
|
|
}
|
|
|
|
|
|
assign_creeps(opt)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-18 22:00:22 +08:00
|
|
|
|
function assign_task() {
|
|
|
|
|
|
for (const creep_id in Game.creeps) {
|
|
|
|
|
|
let creep = Game.creeps[creep_id];
|
|
|
|
|
|
creep.action();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-20 17:09:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-23 22:19:47 +08:00
|
|
|
|
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) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
Memory.WorkingTarget[builder.name] = { id: builder.id, working_creep_names: [], cate: 'builder' }//在Memory.WorkingTarget加入需要creep的builder
|
2020-10-23 22:19:47 +08:00
|
|
|
|
})
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let builder_memories = _.filter(Memory.WorkingTarget, memory => memory.working_creep_names.length == 0 && memory.cate=='builder')
|
2020-10-23 22:19:47 +08:00
|
|
|
|
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)
|
|
|
|
|
|
}
|
2020-10-20 17:09:06 +08:00
|
|
|
|
}
|
2020-10-23 20:55:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-24 15:24:24 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|
2020-10-23 22:28:40 +08:00
|
|
|
|
return false
|
2020-10-24 15:24:24 +08:00
|
|
|
|
|
|
|
|
|
|
})
|
2020-10-23 20:55:20 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
_.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
|
|
|
|
|
|
})
|
2020-10-23 20:55:20 +08:00
|
|
|
|
})
|
|
|
|
|
|
_.each(creep_name_to_assgin_array, function (creep_name) {
|
|
|
|
|
|
//先计算每一个target目前有多少个creeps了
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let working_creeps_of_target_array = []//记录每个target已有的creep数量
|
2020-10-23 20:55:20 +08:00
|
|
|
|
_.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
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-24 15:24:24 +08:00
|
|
|
|
function assign_harvester_to_enery_source() {
|
2020-10-23 20:55:20 +08:00
|
|
|
|
let sources = Game.spawns['Spawn1'].room.find(FIND_SOURCES_ACTIVE);
|
|
|
|
|
|
let all_memory = Memory.WorkingTarget
|
2020-10-20 17:09:06 +08:00
|
|
|
|
for (let source of sources) {
|
|
|
|
|
|
let id = source.id
|
2020-10-24 15:24:24 +08:00
|
|
|
|
if (!_.find(all_memory,f => f['id'] == id)) {
|
|
|
|
|
|
// console.log(`add id ${id}`)
|
|
|
|
|
|
all_memory[`Energy_${id}`] = { 'id': id, 'working_creep_names': [], "cate": 'ENERGY_SOURCE' };
|
2020-10-20 17:09:06 +08:00
|
|
|
|
}
|
2020-10-23 20:55:20 +08:00
|
|
|
|
}//向Memory.WorkingTarget里添加所有的Energy Source
|
|
|
|
|
|
//寻找Energy Source的Memory
|
|
|
|
|
|
let energy_memory = _.filter(all_memory, { cate: 'ENERGY_SOURCE' })
|
|
|
|
|
|
//寻找creep为0的energy source
|
|
|
|
|
|
let energy_source_need_creep_array = _.filter(energy_memory, m => m.working_creep_names.length == 0)
|
|
|
|
|
|
if (energy_source_need_creep_array.length > 0) {
|
|
|
|
|
|
//找到一个空闲的creep
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let available_creep_array = _.filter(Game.creeps, creep => !creep.working_target_id && creep.memory.role == 'harvester')
|
2020-10-23 20:55:20 +08:00
|
|
|
|
if (available_creep_array.length > 0) {//每次只安排一个
|
|
|
|
|
|
let opt = {
|
|
|
|
|
|
memory: energy_memory,
|
|
|
|
|
|
creep_name_to_assgin_array: [available_creep_array[0].name]
|
2020-10-20 17:09:06 +08:00
|
|
|
|
}
|
2020-10-23 20:55:20 +08:00
|
|
|
|
assign_creeps(opt)
|
2020-10-20 17:09:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-10-23 20:55:20 +08:00
|
|
|
|
}
|
2020-10-20 17:09:06 +08:00
|
|
|
|
|
2020-10-23 20:55:20 +08:00
|
|
|
|
function assign_builder_to_controller() {
|
|
|
|
|
|
//判断room controller 是否有creep,没有则添加
|
|
|
|
|
|
if (!_.find(Memory.WorkingTarget, target => target.id == Game.spawns['Spawn1'].room.controller.id)) {
|
2020-10-24 15:24:24 +08:00
|
|
|
|
Memory.WorkingTarget[`RoomController_${Game.spawns['Spawn1'].room.controller.id}`] = { id: Game.spawns['Spawn1'].room.controller.id, working_creep_names: [], cate: 'ROOM_CONTROLLER' }
|
2020-10-23 20:55:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
let room_controller_mem = _.filter(Memory.WorkingTarget, { cate: 'ROOM_CONTROLLER' })
|
|
|
|
|
|
//寻找creep为0的room controller
|
2020-10-24 15:24:24 +08:00
|
|
|
|
let room_controller_need_creep_array = _.filter(room_controller_mem, m => m.working_creep_names.length == 0 && m.cate=='ROOM_CONTROLLER')
|
2020-10-23 20:55:20 +08:00
|
|
|
|
if (room_controller_need_creep_array.length > 0) {
|
|
|
|
|
|
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]
|
|
|
|
|
|
}
|
|
|
|
|
|
assign_creeps(opt)
|
2020-10-24 15:24:24 +08:00
|
|
|
|
}
|
2020-10-23 20:55:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-20 17:09:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
2020-10-18 22:00:22 +08:00
|
|
|
|
|
2020-10-24 15:24:24 +08:00
|
|
|
|
|
2020-10-18 22:00:22 +08:00
|
|
|
|
|
|
|
|
|
|
function createHarvestCreep() {
|
|
|
|
|
|
//create new creep
|
|
|
|
|
|
let new_creep_name = "AUTO_CREATE_Harvester_" + util.uuid();
|
|
|
|
|
|
let Re_code;
|
|
|
|
|
|
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';
|
2020-10-24 15:24:24 +08:00
|
|
|
|
console.log('Create new creep ' + new_creep_name);
|
2020-10-18 22:00:22 +08:00
|
|
|
|
} else {
|
2020-10-23 20:55:20 +08:00
|
|
|
|
// console.log(`failed to create harvester with code ${Re_code}`);
|
2020-10-18 22:00:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function createTransferCreep() {
|
|
|
|
|
|
//create new creep
|
|
|
|
|
|
let new_creep_name = "AUTO_CREATE_Transfer_" + util.uuid();
|
|
|
|
|
|
let Re_code;
|
|
|
|
|
|
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';
|
2020-10-24 15:24:24 +08:00
|
|
|
|
console.log('Create new creep ' + new_creep_name);
|
2020-10-18 22:00:22 +08:00
|
|
|
|
} else {
|
2020-10-23 20:55:20 +08:00
|
|
|
|
// console.log(`failed to create transfer with code ${Re_code}`);
|
2020-10-18 22:00:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-23 20:55:20 +08:00
|
|
|
|
|
|
|
|
|
|
function createBuilderCreep() {
|
|
|
|
|
|
//create new creep
|
|
|
|
|
|
let new_creep_name = "AUTO_CREATE_Builder_" + util.uuid();
|
|
|
|
|
|
let Re_code;
|
2020-10-23 22:19:47 +08:00
|
|
|
|
Re_code = Game.spawns['Spawn1'].createCreep([MOVE, CARRY, WORK], new_creep_name)
|
2020-10-23 20:55:20 +08:00
|
|
|
|
if (Re_code == new_creep_name) {
|
|
|
|
|
|
Game.creeps[new_creep_name].memory.role = 'builder';
|
2020-10-24 15:24:24 +08:00
|
|
|
|
console.log('Create new creep ' + new_creep_name);
|
2020-10-23 20:55:20 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
// console.log(`failed to create builder with code ${Re_code}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|