引入eslint后重构

This commit is contained in:
facat 2020-10-26 16:15:52 +08:00
parent 27750dbc53
commit 13d37b94f3
13 changed files with 2360 additions and 550 deletions

22
.eslintrc.json Normal file
View File

@ -0,0 +1,22 @@
{
"env": {
"browser": true,
"commonjs": true,
"es2021": true
},
"extends": [
"airbnb-base",
"prettier"
],
"parserOptions": {
"ecmaVersion": 12
},
"rules": {
"prettier/prettier": ["error",{
"endOfLine":"auto"
}]
},
"plugins": [
"prettier"
]
}

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

View File

@ -1,82 +1,101 @@
const utils = require('utils'); /* eslint-disable no-console */
module.exports = { /* eslint-disable func-names */
run(creep) { /* eslint-disable no-undef */
if (creep.working_target_id) { /* eslint-disable camelcase */
let working_target_id = creep.working_target_id; const utils = require("./utils");
let 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')
}
}
}
function upgradeController_job(creep) { function upgradeController_job(creep) {
let working_target_id = creep.working_target_id; const { working_target_id } = creep;
let working_target = Game.getObjectById(working_target_id); const 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 {
let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES) const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
let nearest_dropped_enengy = _.filter(all_dropped_resource, function (energy) { const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
return energy.resourceType == RESOURCE_ENERGY & utils.distance(energy.pos, creep.pos) < 1.5 energy
}) ) {
if (nearest_dropped_enengy.length > 0) { return (
let Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]); energy.resourceType === RESOURCE_ENERGY &&
if (OK == Re_code_pickup || ERR_FULL == Re_code_pickup) { utils.distance(energy.pos, creep.pos) < 1.5
//TODO:需要适应不同的建筑 );
let Re_code = creep.upgradeController(working_target) });
if (OK == Re_code) { if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
} else if (Re_code != ERR_NOT_ENOUGH_RESOURCES && Re_code != ERR_NOT_IN_RANGE) { if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
console.log(`${creep.name} failed to upgrade room controller:err ${Re_code}`) // TODO:需要适应不同的建筑
} const Re_code = creep.upgradeController(working_target);
} else { // eslint-disable-next-line no-empty
console.log(`${creep.name} failed to pickup: err ${Re_code_pickup}`) 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) { function build_construction(creep) {
let working_target_id = creep.working_target_id; const { working_target_id } = creep;
let working_target = Game.getObjectById(working_target_id); const 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 {
let all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES) const all_dropped_resource = creep.room.find(FIND_DROPPED_RESOURCES);
let nearest_dropped_enengy = _.filter(all_dropped_resource, function (energy) { const nearest_dropped_enengy = _.filter(all_dropped_resource, function (
return energy.resourceType == RESOURCE_ENERGY & utils.distance(energy.pos, creep.pos) < 1.5 energy
}) ) {
if (nearest_dropped_enengy.length > 0) { return (
let Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]); energy.resourceType === RESOURCE_ENERGY &&
if (OK == Re_code_pickup || ERR_FULL == Re_code_pickup) { utils.distance(energy.pos, creep.pos) < 1.5
//TODO:需要适应不同的建筑 );
let Re_code = creep.build(working_target) });
if (OK == Re_code) { if (nearest_dropped_enengy.length > 0) {
const Re_code_pickup = creep.pickup(nearest_dropped_enengy[0]);
} else if (Re_code != ERR_NOT_ENOUGH_RESOURCES && Re_code != ERR_NOT_IN_RANGE) { if (OK === Re_code_pickup || ERR_FULL === Re_code_pickup) {
console.log(`${creep.name} failed to build:err ${Re_code}`) // TODO:需要适应不同的建筑
} const Re_code = creep.build(working_target);
} else { // eslint-disable-next-line no-empty
console.log(`${creep.name} failed to pickup: err ${Re_code_pickup}`) 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}`);
}
} }
} }
}
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");
}
},
};

View File

@ -1,9 +1,13 @@
/* eslint-disable no-undef */
module.exports = { module.exports = {
run(creep) { run(creep) {
if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) == 0) { if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
if (creep.transfer(Game.spawns.Spawn1.room.controller, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { if (
creep.moveTo(Game.spawns.Spawn1.room.controller.pos); creep.transfer(Game.spawns.Spawn1.room.controller, RESOURCE_ENERGY) ===
} ERR_NOT_IN_RANGE
} ) {
creep.moveTo(Game.spawns.Spawn1.room.controller.pos);
}
} }
} },
};

View File

@ -1,62 +1,67 @@
const path = require('path') /* eslint-disable no-undef */
module.exports = { /* eslint-disable camelcase */
run(creep) { const path = require("path");
let status = change_status()
switch (status) {
case 'harvester':
creep.say('hv')
harvester_job(creep)
break
case 'picker':
creep.say('pc')
picker_job(creep)
break
}
}
}
function harvester_job(creep) { function harvester_job(creep) {
if (creep.carry.energy < creep.carryCapacity) { if (creep.carry.energy < creep.carryCapacity) {
let working_target_id = creep.working_target_id; const { working_target_id } = creep;
let working_target = Game.getObjectById(working_target_id); const working_target = Game.getObjectById(working_target_id);
if (creep.harvest(working_target) == ERR_NOT_IN_RANGE) { if (creep.harvest(working_target) === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target); creep.moveTo(working_target);
path.visualPath(creep.pos, working_target.pos); 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) { function picker_job(creep) {
if (Game.spawns['Spawn1'].store.getFreeCapacity(RESOURCE_ENERGY) == 0) { if (Game.spawns.Spawn1.store.getFreeCapacity(RESOURCE_ENERGY) === 0) {
creep.say('SB') creep.say("SB");
return return;
} }
let working_target_id = creep.working_target_id; const { working_target_id } = creep;
if (!working_target_id) { if (!working_target_id) {
creep.say('SB') creep.say("SB");
} }
let working_target = Game.getObjectById(working_target_id); const working_target = Game.getObjectById(working_target_id);
let Re_code = creep.harvest(working_target); const Re_code = creep.harvest(working_target);
if (Re_code == ERR_NOT_IN_RANGE) { if (Re_code === ERR_NOT_IN_RANGE) {
creep.moveTo(working_target); creep.moveTo(working_target);
} else { } else if (OK === Re_code) {
if (OK == Re_code) { creep.harvest(working_target);
creep.harvest(working_target); creep.drop(RESOURCE_ENERGY);
creep.drop(RESOURCE_ENERGY); }
}
}
} }
function change_status() { function change_status() {
if (_(Game.creeps).filter({ memory: { role: 'transfer' } }).size() > 0) { if (
return 'picker' _(Game.creeps)
} else { .filter({ memory: { role: "transfer" } })
return 'harvester' .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;
} }
} },
};

26
init.js
View File

@ -1,16 +1,14 @@
/* eslint-disable no-undef */
module.exports = { module.exports = {
init() { init() {
if (!Memory.Task) { if (!Memory.Task) {
Memory.Task = {} Memory.Task = {};
};
Memory.Task.HighPorioty = [];
Memory.Task.LowPorioty = [];
//WorkingTarget是被跟踪物可以是一个structure、energy、constructionSite也可以是一个creep
if (!Memory.WorkingTarget) {
Memory.WorkingTarget = {}
};
} }
} Memory.Task.HighPorioty = [];
Memory.Task.LowPorioty = [];
// WorkingTarget是被跟踪物可以是一个structure、energy、constructionSite也可以是一个creep
if (!Memory.WorkingTarget) {
Memory.WorkingTarget = {};
}
},
};

644
main.js
View File

@ -1,298 +1,402 @@
const init = require('init') /* eslint-disable no-console */
const util = require('utils'); /* eslint-disable no-undef */
const mount = require('mount') /* eslint-disable func-names */
module.exports.loop = function () { /* eslint-disable camelcase */
extra() const mount = require("./mount");
init.init(); const init = require("./init");
mount.mount() const util = require("./utils");
cleanCreeps()
cleanInvalidMemoryCreep()
cleanTargetMemory()
assign_harvester_to_enery_source();
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();
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();
}
let 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
let transfer_number = _.filter(Game.creeps, { memory: { role: 'transfer' } }).length
if ((builder_number + harvester_number) > transfer_number && !isSpawning) {
isSpawning = true
createTransferCreep();
}
}
assign_task();
}
function extra() { function extra() {
// Game.map.visual.circle(Game.getObjectById('5bbcaaeb9099fc012e6326f1').pos) // Game.map.visual.circle(Game.getObjectById('5bbcaaeb9099fc012e6326f1').pos)
// console.log(Game.getObjectById('5f953aa1ad1f54190745a9c3').pos) // console.log(Game.getObjectById('5f953aa1ad1f54190745a9c3').pos)
// Memory.WorkingTarget.CONSTRUCTION_5f952fea10782b5f4ec3690a.working_creep_names=[] // Memory.WorkingTarget.CONSTRUCTION_5f952fea10782b5f4ec3690a.working_creep_names=[]
} }
function cleanCreeps() { function cleanCreeps() {
for (let i in Memory.creeps) { _.each(Object.keys(Memory.creeps), function (key) {
if (!Game.creeps[i]) { if (!Game.creeps[key]) {
console.log(`${i} is invalid, removed from Memory.creeps`) console.log(`${key} is invalid, removed from Memory.creeps`);
delete Memory.creeps[i]; delete Memory.creeps[key];
}
} }
});
} }
function cleanInvalidMemoryCreep() { function cleanInvalidMemoryCreep() {
//清理Memory中已经不存在的creep // 清理Memory中已经不存在的creep
_.each(Memory.WorkingTarget, function (target) { _.each(Memory.WorkingTarget, function (target) {
_.remove(target.working_creep_names, function (creep_name) { _.remove(target.working_creep_names, function (creep_name) {
if (!Game.creeps[creep_name]) { if (!Game.creeps[creep_name]) {
console.log(`${creep_name} is invalid, removed from working_creep_names`) console.log(
return true `${creep_name} is invalid, removed from working_creep_names`
} );
return false return true;
}
}) return false;
}) });
});
} }
function cleanTargetMemory() { function cleanTargetMemory() {
for (let i of Object.keys(Memory.WorkingTarget)) { _.each(Object.keys(Memory.WorkingTarget), function (target) {
let target = Memory.WorkingTarget[i] if (!Game.getObjectById(target.id)) {
if (!Game.getObjectById(target.id)) { console.log(
console.log(`target ${target.id} is invalid, removed from Memory.WorkingTarget.Set their creep to idle`) `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]; _.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
}
});
}
function assign_transfer(target_memory) { function assign_transfer(target_memory) {
const NO_IDLE_TRANSFER = -1 const NO_IDLE_TRANSFER = -1;
const OK_TRANSFER = 0 const OK_TRANSFER = 0;
if (target_memory.length > 0) { const MEMORY_EMPTY = -2;
let idle_transfer = _.filter(Game.creeps, creep => !creep.working_target_id && (creep.memory.role == 'transfer')) if (target_memory.length > 0) {
if (idle_transfer.length > 0) {//一次只安排一个creep const idle_transfer = _.filter(
let opt = { Game.creeps,
memory: target_memory, (creep) => !creep.working_target_id && creep.memory.role === "transfer"
creep_name_to_assign_array: [idle_transfer[0].name] );
} if (idle_transfer.length > 0) {
assign_creeps(opt) // 一次只安排一个creep
return OK_TRANSFER const opt = {
} else { memory: target_memory,
return NO_IDLE_TRANSFER creep_name_to_assign_array: [idle_transfer[0].name],
};
} assign_creeps(opt);
return OK_TRANSFER;
} }
return NO_IDLE_TRANSFER;
}
return MEMORY_EMPTY;
} }
//TODO:应该和assign_transfer_to_builder合并 // TODO:应该和assign_transfer_to_builder合并
function assign_transfer_to_harvester() { function assign_transfer_to_harvester() {
//判断有多少个picker的transfer为0 // 判断有多少个picker的transfer为0
let harvester_without_creep = _.filter(Game.creeps, function (creep) { const harvester_without_creep = _.filter(Game.creeps, function (creep) {
return !Memory.WorkingTarget[creep.name] && creep.memory.role == 'harvester'//Memory.WorkingTarget中没有这个harvester目标 return (
}) !Memory.WorkingTarget[creep.name] && creep.memory.role === "harvester"
_.each(harvester_without_creep, function (harvester_creep) { ); // Memory.WorkingTarget中没有这个harvester目标
Memory.WorkingTarget[harvester_creep.name] = { id: harvester_creep.id, working_creep_names: [], cate: 'harvester' }//在Memory.WorkingTarget加入需要creep的Picker });
}) _.each(harvester_without_creep, function (harvester_creep) {
let harvester_needs_creep_memory = _.filter(Memory.WorkingTarget, memory => memory.working_creep_names.length == 0 && memory.cate == 'harvester')//需要安排creep的harvester Memory.WorkingTarget[harvester_creep.name] = {
assign_transfer(harvester_needs_creep_memory) 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() { function assign_task() {
for (const creep_id in Game.creeps) { _.each(Object.keys(Game.creeps), (creep_name) => {
let creep = Game.creeps[creep_id]; const creep = Game.creeps[creep_name];
creep.action(); creep.action();
} });
}
function assign_transfer_to_builder() {
//判断有多少个builder的transfer为0
let 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
})
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 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_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
}
})
}
function assign_harvester_to_enery_source() {
let sources = Game.spawns['Spawn1'].room.find(FIND_SOURCES_ACTIVE);
let all_memory = Memory.WorkingTarget
for (let source of sources) {
let id = source.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
//寻找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
let available_creep_array = _.filter(Game.creeps, creep => !creep.working_target_id && creep.memory.role == 'harvester')
if (available_creep_array.length > 0) {//每次只安排一个
let 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) {
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')
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_assign_array: [builder_creep[0].name]
}
assign_creeps(opt)
}
}
}
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';
console.log('Create new creep ' + new_creep_name);
} else {
// console.log(`failed to create harvester with code ${Re_code}`);
}
}
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';
console.log('Create new creep ' + new_creep_name);
} else {
// console.log(`failed to create transfer with code ${Re_code}`);
}
} }
function createBuilderCreep() { function createBuilderCreep() {
//create new creep // create new creep
let new_creep_name = "AUTO_CREATE_Builder_" + util.uuid(); const new_creep_name = `AUTO_CREATE_Builder_${util.uuid()}`;
let Re_code; const Re_code = Game.spawns.Spawn1.createCreep(
Re_code = Game.spawns['Spawn1'].createCreep([MOVE, CARRY, WORK], new_creep_name) [MOVE, CARRY, WORK],
if (Re_code == new_creep_name) { new_creep_name
Game.creeps[new_creep_name].memory.role = 'builder'; );
console.log('Create new creep ' + new_creep_name); if (Re_code === new_creep_name) {
} else { Game.creeps[new_creep_name].memory.role = "builder";
// console.log(`failed to create builder with code ${Re_code}`); 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();
}
}
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`
);
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"
);
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;
}
}
}
// 判断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}`);
}
}
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}`);
}
}
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);
}
});
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();
};

View File

@ -1,42 +1,47 @@
const harvester = require('harvester'); /* eslint-disable func-names */
const transfer = require('transfer'); /* eslint-disable no-console */
const builder = require('builder'); /* eslint-disable camelcase */
module.exports = { /* eslint-disable no-undef */
mount() { const harvester = require("./harvester");
Creep.prototype.action = action; const transfer = require("./transfer");
if (!(Creep.prototype.hasOwnProperty('working_target_id'))) { const builder = require("./builder");
Object.defineProperty(Creep.prototype, 'working_target_id', {
get: function () {
return this.memory.working_target_id
},
set: function (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))
}
}
}
function action() { function action() {
let role = this.memory.role; const { role } = this.memory;
// this.say(`${role}`); // this.say(`${role}`);
switch (role) { switch (role) {
case "harvester": case "harvester":
harvester.run(this) harvester.run(this);
break; break;
case "transfer": case "transfer":
transfer.run(this) transfer.run(this);
break; break;
case "builder": case "builder":
builder.run(this) builder.run(this);
break; 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));
};
},
};

1627
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

19
package.json Normal file
View File

@ -0,0 +1,19 @@
{
"name": "screeps-script",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^7.12.0",
"eslint-config-airbnb-base": "^14.2.0",
"eslint-config-prettier": "^6.14.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-prettier": "^3.1.4",
"prettier": "^2.1.2"
}
}

View File

@ -1,8 +1,3 @@
module.exports = { module.exports = {
visualPath(my_pos, target_pos) { visualPath(my_pos, target_pos) {},
// visualize the path };
// let path = PathFinder.search(my_pos, target_pos).path;
// console.log(path)
// Game.map.visual.poly(path, { stroke: '#ffffff', strokeWidth: 8, opacity: .2, lineStyle: 'dashed' });
}
}

View File

@ -1,73 +1,83 @@
const utils = require('utils') /* eslint-disable no-undef */
const path = require('path') /* eslint-disable no-console */
/* eslint-disable camelcase */
const utils = require("./utils");
const path = require("./path");
// const harvester = require("./harvester"); // const harvester = require("./harvester");
module.exports = { module.exports = {
run(creep) { run(creep) {
creep.say('tf') creep.say("tf");
let working_target_id = creep.working_target_id const { working_target_id } = creep;
if(!working_target_id){ if (!working_target_id) {
creep.say('SB') creep.say("SB");
return return;
}
let 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
}
let working_target_pos = working_target.pos
let 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()) {
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
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'],{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);
}
}
}
} }
} 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()) {
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);
}
}
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);
}
}
},
};

View File

@ -1,22 +1,23 @@
module.exports = { module.exports = {
uuid() { uuid() {
//6位 // 6位
let _uuid = ""; let uuid = "";
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i += 1) {
if (Math.random() > 0.5) { if (Math.random() > 0.5) {
//大于0.5就是数字,小于则是字母 // 大于0.5就是数字,小于则是字母
_uuid = _uuid + (Math.round((Math.random() * 100)) % 10 ); uuid += Math.round(Math.random() * 100) % 10;
} else { } else {
_uuid = _uuid + String.fromCharCode(97 + (Math.round(Math.random() * 100)) % 26); uuid += String.fromCharCode(
} 97 + (Math.round(Math.random() * 100) % 26)
} );
return _uuid; }
},
distance(pos1,pos2){
if(pos1.roomName==pos2.roomName){
return Math.sqrt(Math.pow((pos1.x-pos2.x),2)+Math.pow((pos1.y-pos2.y),2));
}
return -1;//如果不在一个房间内,就返回负数。
} }
return uuid;
} },
distance(pos1, pos2) {
if (pos1.roomName === pos2.roomName) {
return Math.sqrt((pos1.x - pos2.x, 2) ** 2);
}
return -1; // 如果不在一个房间内,就返回负数。
},
};