From fc5b2fe0ba1c8773a86a05b3c824efc55fc61d99 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 29 Nov 2016 15:47:47 -0500 Subject: [PATCH 001/123] play1 --- swampy1/lil_army.js | 101 ++++++++++++++++++++++++++++++++++++++ swampy1/main.js | 38 ++++++++++++++ swampy1/role.builder.js | 32 ++++++++++++ swampy1/role.harvester.js | 35 +++++++++++++ swampy1/role.upgrader.js | 30 +++++++++++ swampy1/util.js | 33 +++++++++++++ 6 files changed, 269 insertions(+) create mode 100644 swampy1/lil_army.js create mode 100644 swampy1/main.js create mode 100644 swampy1/role.builder.js create mode 100644 swampy1/role.harvester.js create mode 100644 swampy1/role.upgrader.js create mode 100644 swampy1/util.js diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js new file mode 100644 index 0000000..fe9823a --- /dev/null +++ b/swampy1/lil_army.js @@ -0,0 +1,101 @@ +const util = require("util"); + +let notice = function(textinfo) +{ + console.log("lil " + textinfo) +} + +let _army_composition = +[ + {"model":"baby_harvester", "count" : 6}, + {"model":"baby_builder", "count":1}, + {"model":"baby_upgrader", "count" : 1} +]; + +let models = +{ + "baby_builder" : { + "body" : [MOVE,WORK,CARRY,WORK], + "role" : "builder", + "prefix" : "bbldr_" + }, + "baby_harvester" : { + "body" : [MOVE,MOVE,WORK,CARRY,CARRY], + "role" : "harvester", + "prefix" : "bharv_" + }, + "baby_upgrader" : { + "body" : [MOVE,WORK,CARRY,WORK], + "role" : "upgrader", + "prefix" : "bupgd_" + } +}; + +function _make_creep(model, spawn_name) +{ + let modl = models[model]; + + if( 0 != Game.spawns[spawn_name].canCreateCreep(modl.body) ) + return; + + let newname = modl.prefix + util.getRandomName(); + notice("Making a \"" + model + "\" " + newname); + let ret = Game.spawns[spawn_name].createCreep(modl.body, newname, {role:modl.role, model:model}); + if(ret < 0) + { + notice("Failed to make a \"" + model + "\" " + newname + " "+ ret); + } + return ret; +} + +function next_missing(inventory) +{ + for(let x=0; x<_army_composition.length; ++x ) + { + let spec = _army_composition[x]; + let cur_count = inventory[spec.model]; + if( cur_count < spec.count ) + { + return spec.model; + } + } + return null; +} + +function compute_inventory() +{ + let ret = {}; + for(let modl in models) + ret[modl] = 0; + for(var name in Game.creeps) { + var creep = Game.creeps[name]; + if(creep.memory.model) + ret[creep.memory.model] ++; + } +//console.log(JSON.stringify(ret)); + return ret; +} + +function one_run(spawn_name) +{ + if(Game.spawns[spawn_name].spawning) + return;//busy now + + for(let name in Memory.creeps) + { + if(!Game.creeps[name]) { + delete Memory.creeps[name]; + //console.log('Clearing non-existing creep memory:', name); + } + } + + let inv = compute_inventory(); + let needed = next_missing(inv); + if(needed) + _make_creep(needed, spawn_name); +} + +module.exports = { + one_run : one_run +}; + diff --git a/swampy1/main.js b/swampy1/main.js new file mode 100644 index 0000000..aa818c1 --- /dev/null +++ b/swampy1/main.js @@ -0,0 +1,38 @@ +var roleHarvester = require('role.harvester'); +var roleUpgrader = require('role.upgrader'); +var roleBuilder = require('role.builder'); +var lil_army = require('lil_army'); + +module.exports.loop = function () { + + lil_army.one_run("Spawn1"); + + var tower = null;//Game.getObjectById('TOWER_ID'); + if(tower) { + var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { + filter: (structure) => structure.hits < structure.hitsMax + }); + if(closestDamagedStructure) { + tower.repair(closestDamagedStructure); + } + + var closestHostile = tower.pos.findClosestByRange(FIND_HOSTILE_CREEPS); + if(closestHostile) { + tower.attack(closestHostile); + } + } + + + for(var name in Game.creeps) { + var creep = Game.creeps[name]; + if(creep.memory.role == 'harvester') { + roleHarvester.run(creep); + } + if(creep.memory.role == 'upgrader') { + roleUpgrader.run(creep); + } + if(creep.memory.role == 'builder') { + roleBuilder.run(creep); + } + } +} diff --git a/swampy1/role.builder.js b/swampy1/role.builder.js new file mode 100644 index 0000000..67f0107 --- /dev/null +++ b/swampy1/role.builder.js @@ -0,0 +1,32 @@ +var roleBuilder = { + + /** @param {Creep} creep **/ + run: function(creep) { + + if(creep.memory.building && creep.carry.energy == 0) { + creep.memory.building = false; + creep.say('harvesting'); + } + if(!creep.memory.building && creep.carry.energy == creep.carryCapacity) { + creep.memory.building = true; + creep.say('building'); + } + + if(creep.memory.building) { + var targets = creep.room.find(FIND_CONSTRUCTION_SITES); + if(targets.length) { + if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) { + creep.moveTo(targets[0]); + } + } + } + else { + var sources = creep.room.find(FIND_SOURCES); + if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) { + creep.moveTo(sources[0]); + } + } + } +}; + +module.exports = roleBuilder; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js new file mode 100644 index 0000000..47be760 --- /dev/null +++ b/swampy1/role.harvester.js @@ -0,0 +1,35 @@ + +var roleHarvester = { + + /** @param {Creep} creep **/ + run: function(creep) { + + if(creep.carry.energy < creep.carryCapacity) { + var sources = creep.room.find(FIND_SOURCES_ACTIVE); + if(creep.memory.harvest_from_node == null || creep.memory.harvest_from_node > sources.length) + { + creep.memory.harvest_from_node = getRandomInt(0, sources.length); + } + + if(creep.harvest(sources[creep.memory.harvest_from_node]) == ERR_NOT_IN_RANGE) { + creep.moveTo(sources[creep.memory.harvest_from_node]); + } + } + else { + var targets = creep.room.find(FIND_STRUCTURES, { + filter: (structure) => { + return (structure.structureType == STRUCTURE_EXTENSION + || structure.structureType == STRUCTURE_SPAWN + || structure.structureType == STRUCTURE_TOWER ) && + structure.energy < structure.energyCapacity; + } + }); + if(targets.length > 0) { + if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { + creep.moveTo(targets[0]); + } + } + } + } +}; + diff --git a/swampy1/role.upgrader.js b/swampy1/role.upgrader.js new file mode 100644 index 0000000..333a540 --- /dev/null +++ b/swampy1/role.upgrader.js @@ -0,0 +1,30 @@ +var roleUpgrader = { + + /** @param {Creep} creep **/ + run: function(creep) { + + if(creep.memory.upgrading && creep.carry.energy == 0) { + creep.memory.upgrading = false; + creep.say('harvesting'); + } + if(!creep.memory.upgrading && creep.carry.energy == creep.carryCapacity) { + creep.memory.upgrading = true; + creep.say('upgrading'); + } + + if(creep.memory.upgrading) { + if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) { + creep.moveTo(creep.room.controller); + } + } + else { + var sources = creep.room.find(FIND_SOURCES); + if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) { + creep.moveTo(sources[0]); + } + } + } +}; + +module.exports = roleUpgrader; + diff --git a/swampy1/util.js b/swampy1/util.js new file mode 100644 index 0000000..0295e98 --- /dev/null +++ b/swampy1/util.js @@ -0,0 +1,33 @@ + + +function getRandomInt(min, max) +{ + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} + +function getRandomName() +{ + let ret = ""; + return ret; + + let hex = "01234567890ABCDEF"; + let rando = getRandomInt(0x1000000, 0xFFFFFFF); + for(let x = 0; x < 7; ++x) + { + let cho = rando % 16; + ret += hex[cho]; + rando = rando / 16; + } + return ret; + + +} + +module.exports = +{ + getRandomInt : getRandomInt, + getRandomName : getRandomName +}; + From 8f3a50211348948d6ba2debd423dbbddffd85588 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 30 Nov 2016 09:41:49 -0500 Subject: [PATCH 002/123] playing around --- swampy1/main.js | 24 +++++++++++++++++++++++- swampy1/role.harvester.js | 6 ++++++ swampy1/util.js | 8 +++----- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index aa818c1..03d3368 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -3,11 +3,29 @@ var roleUpgrader = require('role.upgrader'); var roleBuilder = require('role.builder'); var lil_army = require('lil_army'); + +function defendRoom(roomName) { + + var hostiles = Game.rooms[roomName].find(FIND_HOSTILE_CREEPS); + + if(hostiles.length > 0) { + var username = hostiles[0].owner.username; + Game.notify(`User ${username} spotted in room ${roomName}`); + var towers = Game.rooms[roomName].find( + FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}}); + towers.forEach(tower => tower.attack(hostiles[0])); + } +} + + module.exports.loop = function () { + //pos.roomName; + let cur_room_name = Object.keys(Game.rooms)[0]; + let cur_room = Game.rooms[cur_room_name]; lil_army.one_run("Spawn1"); - var tower = null;//Game.getObjectById('TOWER_ID'); + var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; if(tower) { var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { filter: (structure) => structure.hits < structure.hitsMax @@ -21,6 +39,10 @@ module.exports.loop = function () { tower.attack(closestHostile); } } + else + { + cur_room.createConstructionSite(21, 25, STRUCTURE_TOWER); + } for(var name in Game.creeps) { diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 47be760..ea38273 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -29,6 +29,12 @@ var roleHarvester = { creep.moveTo(targets[0]); } } + else + { + targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); + if(targets.length > 0) + creep.moveTo(targets[0]); + } } } }; diff --git a/swampy1/util.js b/swampy1/util.js index 0295e98..1eedac4 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -10,19 +10,17 @@ function getRandomInt(min, max) function getRandomName() { let ret = ""; - return ret; let hex = "01234567890ABCDEF"; let rando = getRandomInt(0x1000000, 0xFFFFFFF); for(let x = 0; x < 7; ++x) { - let cho = rando % 16; - ret += hex[cho]; + let cho = parseInt(rando % 16); + //console.log(`||| x = ${x} cho = ${cho} hex=${hex.charAt(cho)}`); + ret += hex.charAt(cho); rando = rando / 16; } return ret; - - } module.exports = From 5801832d8fd6459a2d7eff447e1831263ec3771f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 30 Nov 2016 11:03:48 -0500 Subject: [PATCH 003/123] Build larger spawns automatically in proportion to possible --- swampy1/lil_army.js | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index fe9823a..4668fc3 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -5,11 +5,24 @@ let notice = function(textinfo) console.log("lil " + textinfo) } + +let _BODYPART_COST = +{ + "move": 50, + "work": 100, + "attack": 80, + "carry": 50, + "heal": 250, + "ranged_attack": 150, + "tough": 10, + "claim": 600 +}; + let _army_composition = [ {"model":"baby_harvester", "count" : 6}, - {"model":"baby_builder", "count":1}, - {"model":"baby_upgrader", "count" : 1} + {"model":"baby_builder", "count": 3}, + {"model":"baby_upgrader", "count" : 3} ]; let models = @@ -25,7 +38,7 @@ let models = "prefix" : "bharv_" }, "baby_upgrader" : { - "body" : [MOVE,WORK,CARRY,WORK], + "body" : [MOVE,CARRY,WORK,WORK], "role" : "upgrader", "prefix" : "bupgd_" } @@ -34,16 +47,32 @@ let models = function _make_creep(model, spawn_name) { let modl = models[model]; + let body_spec = []; + let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; + let at_ndx = 0; + let mx_ndx = modl.body.length; + let getpart = at_ndx => modl.body[at_ndx]; + let part = getpart(at_ndx); + let energy_used = 0; + + while(energy_to_consume >= _BODYPART_COST[part]) + { + energy_to_consume -= _BODYPART_COST[part]; + energy_used += BODYPART_COST[part]; + body_spec.push(part); + at_ndx = (at_ndx + 1) % mx_ndx; + part = getpart(at_ndx); + } - if( 0 != Game.spawns[spawn_name].canCreateCreep(modl.body) ) + if( 0 != Game.spawns[spawn_name].canCreateCreep(body_spec) ) return; - + let newname = modl.prefix + util.getRandomName(); - notice("Making a \"" + model + "\" " + newname); - let ret = Game.spawns[spawn_name].createCreep(modl.body, newname, {role:modl.role, model:model}); + notice("Making a \"" + model + "\" " + newname + ` (${energy_used})`); + let ret = Game.spawns[spawn_name].createCreep(body_spec, newname, {role:modl.role, model:model}); if(ret < 0) { - notice("Failed to make a \"" + model + "\" " + newname + " "+ ret); + notice("Failed to make a \"" + model + "\" " + newname + " "+ ret + ` (${energy_used})`); } return ret; } From 94e4ef9965bbd09764cf68bd70f25acb00223172 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 30 Nov 2016 17:03:08 -0500 Subject: [PATCH 004/123] reporting enhancements --- swampy1/lil_army.js | 22 ++++++++----------- swampy1/main.js | 1 + swampy1/reports.js | 53 +++++++++++++++++++++++++++++++++++++++++++++ swampy1/util.js | 14 +++++++++++- 4 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 swampy1/reports.js diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 4668fc3..876d3cd 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -6,17 +6,6 @@ let notice = function(textinfo) } -let _BODYPART_COST = -{ - "move": 50, - "work": 100, - "attack": 80, - "carry": 50, - "heal": 250, - "ranged_attack": 150, - "tough": 10, - "claim": 600 -}; let _army_composition = [ @@ -54,10 +43,16 @@ function _make_creep(model, spawn_name) let getpart = at_ndx => modl.body[at_ndx]; let part = getpart(at_ndx); let energy_used = 0; + + if( Memory.max_energy != energy_to_consume) + { + Memory.max_energy = energy_to_consume; + console.log(`Energy Class updated to ${Memory.max_energy}`); + } - while(energy_to_consume >= _BODYPART_COST[part]) + while(energy_to_consume >= util.BODYPART_COST[part]) { - energy_to_consume -= _BODYPART_COST[part]; + energy_to_consume -= util.BODYPART_COST[part]; energy_used += BODYPART_COST[part]; body_spec.push(part); at_ndx = (at_ndx + 1) % mx_ndx; @@ -69,6 +64,7 @@ function _make_creep(model, spawn_name) let newname = modl.prefix + util.getRandomName(); notice("Making a \"" + model + "\" " + newname + ` (${energy_used})`); + notice(" spec = " + body_spec.join(",")); let ret = Game.spawns[spawn_name].createCreep(body_spec, newname, {role:modl.role, model:model}); if(ret < 0) { diff --git a/swampy1/main.js b/swampy1/main.js index 03d3368..d871a7e 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -2,6 +2,7 @@ var roleHarvester = require('role.harvester'); var roleUpgrader = require('role.upgrader'); var roleBuilder = require('role.builder'); var lil_army = require('lil_army'); +var reports = require('reports'); function defendRoom(roomName) { diff --git a/swampy1/reports.js b/swampy1/reports.js new file mode 100644 index 0000000..c63a969 --- /dev/null +++ b/swampy1/reports.js @@ -0,0 +1,53 @@ +const util = require("util"); + +function report_creep_makes() +{ + var toprint = []; + for(var name in Game.creeps) { + var creep = Game.creeps[name]; + + let Crpname = creep.name; + let role = creep.memory.role; + let model = creep.memory.model; + let body = {}; + let body_str = []; + for(let part_no in creep.body) + { + let part = creep.body[part_no]; + if(null == body[part.type]) + body[part.type] = 1; + else + ++ body[part.type]; + } + let energy_rating = 0; + for(let part in body) + { + energy_rating += BODYPART_COST[part] * body[part]; + body_str.push(`${part}: ${body[part]}`) + } + + energy_rating = parseInt(energy_rating); + body_str = body_str.join(", "); + + toprint.push({Crpname:Crpname, energy_rating:energy_rating, role:role, model:model, body_str:body_str}); + } + //sort by type, energy + toprint = toprint.sort( (a,b) => + { + let res = a.model.localeCompare(b.model); + if(res) + return res; + return a.energy_rating - b.energy_rating + }); + //print + for( let ndx in toprint) + { + let trp = toprint[ndx]; + console.log(`${trp.Crpname} [${trp.energy_rating}] ${trp.role} ${trp.model} (${trp.body_str})`); + } +} + +module.exports = +{ +report_creep_makes : report_creep_makes, +}; diff --git a/swampy1/util.js b/swampy1/util.js index 1eedac4..0402a89 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -23,9 +23,21 @@ function getRandomName() return ret; } +let XXXBODYPART_COST = +{ + "move": 50, + "work": 100, + "attack": 80, + "carry": 50, + "heal": 250, + "ranged_attack": 150, + "tough": 10, + "claim": 600 +}; + module.exports = { getRandomInt : getRandomInt, - getRandomName : getRandomName + getRandomName : getRandomName, }; From 0f6d9cbb9c95ad340ce8b7ca958b87b3fbed35f4 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 09:55:59 -0500 Subject: [PATCH 005/123] use jshint to improve code --- .gitignore | 2 ++ swampy1/.jshintrc | 6 ++++++ swampy1/lil_army.js | 7 ++++--- swampy1/main.js | 2 +- swampy1/package.json | 15 +++++++++++++++ swampy1/reports.js | 4 ++-- swampy1/role.builder.js | 8 ++++---- swampy1/role.harvester.js | 2 +- swampy1/role.upgrader.js | 8 ++++---- 9 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 .gitignore create mode 100644 swampy1/.jshintrc create mode 100644 swampy1/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb03e3e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.log diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc new file mode 100644 index 0000000..7b478a9 --- /dev/null +++ b/swampy1/.jshintrc @@ -0,0 +1,6 @@ +{ + "esversion" : 6, + "node" : true, + "laxbreak" : true, + "eqnull" : true +} diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 876d3cd..c6ea713 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -1,9 +1,10 @@ +"use strict"; const util = require("util"); let notice = function(textinfo) { - console.log("lil " + textinfo) -} + console.log("lil " + textinfo); +}; @@ -59,7 +60,7 @@ function _make_creep(model, spawn_name) part = getpart(at_ndx); } - if( 0 != Game.spawns[spawn_name].canCreateCreep(body_spec) ) + if( 0 !== Game.spawns[spawn_name].canCreateCreep(body_spec) ) return; let newname = modl.prefix + util.getRandomName(); diff --git a/swampy1/main.js b/swampy1/main.js index d871a7e..3248284 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -58,4 +58,4 @@ module.exports.loop = function () { roleBuilder.run(creep); } } -} +}; diff --git a/swampy1/package.json b/swampy1/package.json new file mode 100644 index 0000000..aa6aad3 --- /dev/null +++ b/swampy1/package.json @@ -0,0 +1,15 @@ +{ + "name": "swampy1", + "version": "1.0.0", + "description": "", + "main": "main.js", + "dependencies": { + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint" : "jshint *.js" + }, + "author": "", + "license": "ISC" +} diff --git a/swampy1/reports.js b/swampy1/reports.js index c63a969..3f3a74d 100644 --- a/swampy1/reports.js +++ b/swampy1/reports.js @@ -23,7 +23,7 @@ function report_creep_makes() for(let part in body) { energy_rating += BODYPART_COST[part] * body[part]; - body_str.push(`${part}: ${body[part]}`) + body_str.push(`${part}: ${body[part]}`); } energy_rating = parseInt(energy_rating); @@ -37,7 +37,7 @@ function report_creep_makes() let res = a.model.localeCompare(b.model); if(res) return res; - return a.energy_rating - b.energy_rating + return a.energy_rating - b.energy_rating; }); //print for( let ndx in toprint) diff --git a/swampy1/role.builder.js b/swampy1/role.builder.js index 67f0107..0c4d683 100644 --- a/swampy1/role.builder.js +++ b/swampy1/role.builder.js @@ -3,11 +3,11 @@ var roleBuilder = { /** @param {Creep} creep **/ run: function(creep) { - if(creep.memory.building && creep.carry.energy == 0) { + if(creep.memory.building && creep.carry.energy === 0) { creep.memory.building = false; creep.say('harvesting'); } - if(!creep.memory.building && creep.carry.energy == creep.carryCapacity) { + if(!creep.memory.building && creep.carry.energy === creep.carryCapacity) { creep.memory.building = true; creep.say('building'); } @@ -15,14 +15,14 @@ var roleBuilder = { if(creep.memory.building) { var targets = creep.room.find(FIND_CONSTRUCTION_SITES); if(targets.length) { - if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) { + if(creep.build(targets[0]) === ERR_NOT_IN_RANGE) { creep.moveTo(targets[0]); } } } else { var sources = creep.room.find(FIND_SOURCES); - if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) { + if(creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) { creep.moveTo(sources[0]); } } diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index ea38273..7b32ed7 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -6,7 +6,7 @@ var roleHarvester = { if(creep.carry.energy < creep.carryCapacity) { var sources = creep.room.find(FIND_SOURCES_ACTIVE); - if(creep.memory.harvest_from_node == null || creep.memory.harvest_from_node > sources.length) + if(creep.memory.harvest_from_node === null || creep.memory.harvest_from_node > sources.length) { creep.memory.harvest_from_node = getRandomInt(0, sources.length); } diff --git a/swampy1/role.upgrader.js b/swampy1/role.upgrader.js index 333a540..c603bfe 100644 --- a/swampy1/role.upgrader.js +++ b/swampy1/role.upgrader.js @@ -3,23 +3,23 @@ var roleUpgrader = { /** @param {Creep} creep **/ run: function(creep) { - if(creep.memory.upgrading && creep.carry.energy == 0) { + if(creep.memory.upgrading && creep.carry.energy === 0) { creep.memory.upgrading = false; creep.say('harvesting'); } - if(!creep.memory.upgrading && creep.carry.energy == creep.carryCapacity) { + if(!creep.memory.upgrading && creep.carry.energy === creep.carryCapacity) { creep.memory.upgrading = true; creep.say('upgrading'); } if(creep.memory.upgrading) { - if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) { + if(creep.upgradeController(creep.room.controller) === ERR_NOT_IN_RANGE) { creep.moveTo(creep.room.controller); } } else { var sources = creep.room.find(FIND_SOURCES); - if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) { + if(creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) { creep.moveTo(sources[0]); } } From a3b92805b512a9ec3b90b36d56b4afaf6235f3b5 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 10:34:17 -0500 Subject: [PATCH 006/123] Fix use of BODYPART_COST --- swampy1/lil_army.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index c6ea713..ff07794 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -51,9 +51,9 @@ function _make_creep(model, spawn_name) console.log(`Energy Class updated to ${Memory.max_energy}`); } - while(energy_to_consume >= util.BODYPART_COST[part]) + while(energy_to_consume >= BODYPART_COST[part]) { - energy_to_consume -= util.BODYPART_COST[part]; + energy_to_consume -= BODYPART_COST[part]; energy_used += BODYPART_COST[part]; body_spec.push(part); at_ndx = (at_ndx + 1) % mx_ndx; From 13fddc890e6b3f10ba2631e53d26fab5181688a6 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 10:47:37 -0500 Subject: [PATCH 007/123] Fix harv Module --- swampy1/role.harvester.js | 1 + 1 file changed, 1 insertion(+) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 7b32ed7..2fc0a4f 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -39,3 +39,4 @@ var roleHarvester = { } }; +module.exports = roleHarvester; From ffac65e25e6c2a32cfb7c00d9484e8157977cb32 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 11:41:16 -0500 Subject: [PATCH 008/123] harvester talk --- swampy1/lil_army.js | 2 +- swampy1/role.harvester.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index ff07794..0bc73ff 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -65,7 +65,7 @@ function _make_creep(model, spawn_name) let newname = modl.prefix + util.getRandomName(); notice("Making a \"" + model + "\" " + newname + ` (${energy_used})`); - notice(" spec = " + body_spec.join(",")); + //notice(" spec = " + body_spec.join(",")); let ret = Game.spawns[spawn_name].createCreep(body_spec, newname, {role:modl.role, model:model}); if(ret < 0) { diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 2fc0a4f..699b9f3 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -1,4 +1,12 @@ +function set_doing_state(creep, state) +{ + if(creep.memory.doing_state != state) + { + creep.say("${state}!"); + } + creep.memory.doing_state = state; +} var roleHarvester = { /** @param {Creep} creep **/ @@ -11,6 +19,7 @@ var roleHarvester = { creep.memory.harvest_from_node = getRandomInt(0, sources.length); } + set_doing_state("harvest"); if(creep.harvest(sources[creep.memory.harvest_from_node]) == ERR_NOT_IN_RANGE) { creep.moveTo(sources[creep.memory.harvest_from_node]); } @@ -25,12 +34,14 @@ var roleHarvester = { } }); if(targets.length > 0) { + set_doing_state("retrieve"); if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { creep.moveTo(targets[0]); } } else { + set_doing_state("park"); targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); if(targets.length > 0) creep.moveTo(targets[0]); From ac494ba6a5f2faba006c01db224eb018b3faa9e1 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 12:43:45 -0500 Subject: [PATCH 009/123] fix bad use of ===null, lack of require util --- swampy1/role.harvester.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 699b9f3..575ce76 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -1,3 +1,5 @@ +"use strict"; +const util = require('util'); function set_doing_state(creep, state) { @@ -14,9 +16,9 @@ var roleHarvester = { if(creep.carry.energy < creep.carryCapacity) { var sources = creep.room.find(FIND_SOURCES_ACTIVE); - if(creep.memory.harvest_from_node === null || creep.memory.harvest_from_node > sources.length) + if(creep.memory.harvest_from_node == null || creep.memory.harvest_from_node > sources.length) { - creep.memory.harvest_from_node = getRandomInt(0, sources.length); + creep.memory.harvest_from_node = util.getRandomInt(0, sources.length); } set_doing_state("harvest"); From 0630cec84191265d09b3c154b5b10b582d7cfafd Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 12:46:33 -0500 Subject: [PATCH 010/123] Call function correctly --- swampy1/role.harvester.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 575ce76..fe07ac5 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -1,18 +1,19 @@ "use strict"; const util = require('util'); -function set_doing_state(creep, state) -{ - if(creep.memory.doing_state != state) - { - creep.say("${state}!"); - } - creep.memory.doing_state = state; -} var roleHarvester = { /** @param {Creep} creep **/ run: function(creep) { + + function set_doing_state(state) + { + if(creep.memory.doing_state != state) + { + creep.say("${state}!"); + } + creep.memory.doing_state = state; + } if(creep.carry.energy < creep.carryCapacity) { var sources = creep.room.find(FIND_SOURCES_ACTIVE); From 6cd99a3b5f49d80c55e5596d3d564991f8a564b5 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 12:48:34 -0500 Subject: [PATCH 011/123] fix the print --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index fe07ac5..974bd98 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -10,7 +10,7 @@ var roleHarvester = { { if(creep.memory.doing_state != state) { - creep.say("${state}!"); + creep.say(`${state}!`); } creep.memory.doing_state = state; } From 030fda0443cb55a8b05fa3753daf9e09a3efa3ab Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 12:51:50 -0500 Subject: [PATCH 012/123] revise build order --- swampy1/lil_army.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 0bc73ff..e6151bc 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -10,9 +10,12 @@ let notice = function(textinfo) let _army_composition = [ - {"model":"baby_harvester", "count" : 6}, - {"model":"baby_builder", "count": 3}, - {"model":"baby_upgrader", "count" : 3} + {"model":"baby_harvester", "count" : 2}, + {"model":"baby_builder", "count": 1}, + {"model":"baby_upgrader", "count" : 1}, + {"model":"baby_harvester", "count" : 4}, + {"model":"baby_builder", "count": 2}, + {"model":"baby_upgrader", "count" : 2}, ]; let models = From 2841377f2158111f6d611e77f6cb3dca29e7b294 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 12:58:10 -0500 Subject: [PATCH 013/123] Use doing state for all work creeps --- swampy1/role.builder.js | 8 ++++++-- swampy1/role.harvester.js | 15 +++------------ swampy1/role.upgrader.js | 7 +++++-- swampy1/util.js | 11 +++++++++++ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/swampy1/role.builder.js b/swampy1/role.builder.js index 0c4d683..2be96ec 100644 --- a/swampy1/role.builder.js +++ b/swampy1/role.builder.js @@ -1,3 +1,7 @@ +"use strict"; +const util = require('util'); + + var roleBuilder = { /** @param {Creep} creep **/ @@ -5,11 +9,11 @@ var roleBuilder = { if(creep.memory.building && creep.carry.energy === 0) { creep.memory.building = false; - creep.say('harvesting'); + util.set_doing_state(creep, "harvesting"); } if(!creep.memory.building && creep.carry.energy === creep.carryCapacity) { creep.memory.building = true; - creep.say('building'); + util.set_doing_state(creep, "building"); } if(creep.memory.building) { diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 974bd98..efba09f 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -6,15 +6,6 @@ var roleHarvester = { /** @param {Creep} creep **/ run: function(creep) { - function set_doing_state(state) - { - if(creep.memory.doing_state != state) - { - creep.say(`${state}!`); - } - creep.memory.doing_state = state; - } - if(creep.carry.energy < creep.carryCapacity) { var sources = creep.room.find(FIND_SOURCES_ACTIVE); if(creep.memory.harvest_from_node == null || creep.memory.harvest_from_node > sources.length) @@ -22,7 +13,7 @@ var roleHarvester = { creep.memory.harvest_from_node = util.getRandomInt(0, sources.length); } - set_doing_state("harvest"); + util.set_doing_state(creep, "harvest"); if(creep.harvest(sources[creep.memory.harvest_from_node]) == ERR_NOT_IN_RANGE) { creep.moveTo(sources[creep.memory.harvest_from_node]); } @@ -37,14 +28,14 @@ var roleHarvester = { } }); if(targets.length > 0) { - set_doing_state("retrieve"); + util.set_doing_state(creep, "retrieve"); if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { creep.moveTo(targets[0]); } } else { - set_doing_state("park"); + util.set_doing_state(creep, "park"); targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); if(targets.length > 0) creep.moveTo(targets[0]); diff --git a/swampy1/role.upgrader.js b/swampy1/role.upgrader.js index c603bfe..7ea1124 100644 --- a/swampy1/role.upgrader.js +++ b/swampy1/role.upgrader.js @@ -1,3 +1,6 @@ +"use strict"; +const util = require('util'); + var roleUpgrader = { /** @param {Creep} creep **/ @@ -5,11 +8,11 @@ var roleUpgrader = { if(creep.memory.upgrading && creep.carry.energy === 0) { creep.memory.upgrading = false; - creep.say('harvesting'); + util.set_doing_state(creep, "harvesting"); } if(!creep.memory.upgrading && creep.carry.energy === creep.carryCapacity) { creep.memory.upgrading = true; - creep.say('upgrading'); + util.set_doing_state(creep, "upgrading"); } if(creep.memory.upgrading) { diff --git a/swampy1/util.js b/swampy1/util.js index 0402a89..8dc24b2 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -35,9 +35,20 @@ let XXXBODYPART_COST = "claim": 600 }; +function set_doing_state(creep, state) +{ + if(creep.memory.doing_state != state) + { + creep.say(`${state}!`); + } + creep.memory.doing_state = state; +} + + module.exports = { getRandomInt : getRandomInt, getRandomName : getRandomName, + set_doing_state : set_doing_state, }; From 9cb5bfc2d92781a9fca46e2a9bd68ef4bbcf90e0 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 13:26:14 -0500 Subject: [PATCH 014/123] Park builders not building near spawn --- swampy1/role.builder.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/swampy1/role.builder.js b/swampy1/role.builder.js index 2be96ec..82798d6 100644 --- a/swampy1/role.builder.js +++ b/swampy1/role.builder.js @@ -9,22 +9,37 @@ var roleBuilder = { if(creep.memory.building && creep.carry.energy === 0) { creep.memory.building = false; - util.set_doing_state(creep, "harvesting"); } - if(!creep.memory.building && creep.carry.energy === creep.carryCapacity) { + else if(!creep.memory.building && creep.carry.energy === creep.carryCapacity) { creep.memory.building = true; - util.set_doing_state(creep, "building"); } - if(creep.memory.building) { + if(creep.memory.building) + { var targets = creep.room.find(FIND_CONSTRUCTION_SITES); - if(targets.length) { - if(creep.build(targets[0]) === ERR_NOT_IN_RANGE) { + if(targets.length) + { + util.set_doing_state(creep, "building"); + if(creep.build(targets[0]) === ERR_NOT_IN_RANGE) + { creep.moveTo(targets[0]); } } + else + { + util.set_doing_state(creep, "park"); + targets = creep.room.find(FIND_STRUCTURES, + { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); + if(targets.length > 0) + { + let dest_pos = targets[0].pos; + creep.moveTo(dest_pos.x, dest_pos.y - 3); + } + } } - else { + else + { + util.set_doing_state(creep, "harvesting"); var sources = creep.room.find(FIND_SOURCES); if(creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) { creep.moveTo(sources[0]); From a0d9bcab8cfb5a787f50a7fc5228cd394361c7db Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 13:29:03 -0500 Subject: [PATCH 015/123] right size army --- swampy1/lil_army.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index e6151bc..e21d569 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -13,9 +13,9 @@ let _army_composition = {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, - {"model":"baby_harvester", "count" : 4}, - {"model":"baby_builder", "count": 2}, - {"model":"baby_upgrader", "count" : 2}, + {"model":"baby_harvester", "count" : 6}, + {"model":"baby_builder", "count": 3}, + {"model":"baby_upgrader", "count" : 3}, ]; let models = From faedb28da27c5488b012d5b396a820b61248ce61 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 14:54:05 -0500 Subject: [PATCH 016/123] Start minng planner --- swampy1/mining_planner.js | 39 +++++++++++++++++++++++++++++++++++++++ swampy1/role.harvester.js | 2 +- swampy1/util.js | 7 +++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 swampy1/mining_planner.js diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js new file mode 100644 index 0000000..3f6a4a4 --- /dev/null +++ b/swampy1/mining_planner.js @@ -0,0 +1,39 @@ +"use strict"; +const util = require('util'); +// Memory.mining_map + +//analyze a given room +function analyze_room(room_name) +{ + Memory.mining_map = {}; + let room = Game.rooms[room_name]; + var spawn = room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_SPAWN}})[0]; + let sources = room.find(FIND_SOURCES); + // find all minable nodes, order by distance + for( let ndx in sources) + { + // measure distance to spawn, capacity + let source = sources[ndx]; + source.dis_to_spawn = util.qPosDist(spawn.pos, source.pos); + } + sources = sources.sort((a,b) => b.dis_to_spawn - a.dis_to_spawn); + sources.forEach( (source) => console.log(`Source ${source.id} Distance to spawn = ${source.dis_to_spawn}`)); + Memory.mining_map.sources = sources; + // plan how many miners per node (more per distance? Path? Road? Etc. start with roundly robins) + return; +} +//plan room mining + // initialize mining plan if needed + // or else garbage collect for dead/missing harvesters + // + +//request mining target(room, creep) + // if in mining set, return its target + // add to miners set + // allocate to proper node + // return node + +module.exports = +{ + analyze_room : analyze_room, +}; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index efba09f..dbcc75a 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -12,7 +12,7 @@ var roleHarvester = { { creep.memory.harvest_from_node = util.getRandomInt(0, sources.length); } - + util.set_doing_state(creep, "harvest"); if(creep.harvest(sources[creep.memory.harvest_from_node]) == ERR_NOT_IN_RANGE) { creep.moveTo(sources[creep.memory.harvest_from_node]); diff --git a/swampy1/util.js b/swampy1/util.js index 8dc24b2..652c9b7 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -44,11 +44,18 @@ function set_doing_state(creep, state) creep.memory.doing_state = state; } +function qPosDist(p1,p2) +{ + let xdist = p2.x - p1.x; + let ydist = p2.y - p1.y; + return xdist*xdist + ydist*ydist; +} module.exports = { getRandomInt : getRandomInt, getRandomName : getRandomName, set_doing_state : set_doing_state, + qPosDist : qPosDist }; From 2477c2b15e83712e823e7c64e32ffc14efef75a6 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 16:00:20 -0500 Subject: [PATCH 017/123] Add room mining planner machine --- swampy1/main.js | 14 +++++ swampy1/mining_planner.js | 108 +++++++++++++++++++++++++++++++++++--- swampy1/util.js | 14 ++++- 3 files changed, 128 insertions(+), 8 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index 3248284..cb38e1f 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -3,6 +3,7 @@ var roleUpgrader = require('role.upgrader'); var roleBuilder = require('role.builder'); var lil_army = require('lil_army'); var reports = require('reports'); +var mining_planner = require('mining_planner'); function defendRoom(roomName) { @@ -26,6 +27,12 @@ module.exports.loop = function () { let cur_room = Game.rooms[cur_room_name]; lil_army.one_run("Spawn1"); + if( null == Memory.mining_map) + { + //one time only? + mining_planner.analyze_room("Spawn1"); + } + var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; if(tower) { var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { @@ -58,4 +65,11 @@ module.exports.loop = function () { roleBuilder.run(creep); } } + + if((Game.time % 25) === 0) + { + mining_planner.refresh_room_mining_plan(); + reports.report_creep_makes(); + } + }; diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 3f6a4a4..c0cbd98 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -1,11 +1,16 @@ "use strict"; const util = require('util'); + +const notice = util.mk_notice("mining_planner"); + // Memory.mining_map //analyze a given room function analyze_room(room_name) { - Memory.mining_map = {}; + if( null == Memory.mining_map) + Memory.mining_map = {}; + Memory.mining_map[room_name] = {room_name:room_name}; let room = Game.rooms[room_name]; var spawn = room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_SPAWN}})[0]; let sources = room.find(FIND_SOURCES); @@ -16,24 +21,113 @@ function analyze_room(room_name) let source = sources[ndx]; source.dis_to_spawn = util.qPosDist(spawn.pos, source.pos); } - sources = sources.sort((a,b) => b.dis_to_spawn - a.dis_to_spawn); - sources.forEach( (source) => console.log(`Source ${source.id} Distance to spawn = ${source.dis_to_spawn}`)); - Memory.mining_map.sources = sources; + sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); + sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}}) ); + sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dis_to_spawn}`)); // plan how many miners per node (more per distance? Path? Road? Etc. start with roundly robins) + for( let ndx in sources) + { + let source = sources[ndx]; + source.required_harvesters = 3; + } + let src_map = {}; + sources.map( src => src_map[src.id] = src ); + Memory.mining_map[room_name].sources = src_map; return; } + +function dealloc_harv( mining_map, harv_rec ) +{ + let on_source_id = harv_rec.assigned_to; + if(on_source_id) + { + //remove from source + notice(`dealloc harv ${harv_rec.name} from source ${on_source_id}`); + delete mining_map.sources[on_source_id].harvs[harv_rec.name]; + } + //remove from map + notice(`dealloc harv ${harv_rec.name} from map room ${mining_map.room_name}`); + delete mining_map.harvs[harv_rec.name]; +} + //plan room mining +function refresh_room_mining_plan(room_name) +{ + let mine_map = Memory.mining_map[room_name]; // initialize mining plan if needed - // or else garbage collect for dead/missing harvesters - // + if( null == mine_map.harvs ) + mine_map.harvs = {}; + else + { + // or else garbage collect for dead/missing harvesters + for(let name in mine_map.harvs) + { + if(null == Game.creeps[name]) + { + notice(`Creep ${name} awol from mining`); + dealloc_harv(mine_map, mine_map.harvs[name]); + } + } + } + //allocated harvs are all that is left now +} + +function allocate_creep_to_mine(mine_map, creep) +{ + let room_name = mine_map.room_name; + //search through sources for which one has not enough harvies + let most_needed = null; + let go_to_source = null; + for(let source_id in mine_map.sources) + { + let source = mine_map.sources[source_id]; + let num_needed = source.required_harvesters - source.harvs.length; + if( null == go_to_source || num_needed> most_needed) + { + most_needed = num_needed; + go_to_source = source; + } + } + if(!go_to_source) + { + notice("Creep ${creep.name} has no source to be allocated to!"); + return null; + } + else + { + //remove from source + let harv_rec = {name:creep.name, assigned_to: go_to_source.id}; + notice(`Alloc harv ${creep.name} to source ${go_to_source.id} in room ${room_name}`); + mine_map.sources[go_to_source.id].harvs[creep.name] = harv_rec; + mine_map.harvs[creep.name] = harv_rec; + return go_to_source.id; + } +} //request mining target(room, creep) +function request_mining_target(creep) +{ + let room_name = creep.room.name; + if(! Memory.mining_map || !Memory.mining_map[room_name]) + { + notice("Creep ${creep.name} has no mining map to be allocated to!"); + return null; + } + let mine_map = Memory.mining_map[room_name]; // if in mining set, return its target + if( null != mine_map.harvs[creep.name] ) + { + return mine_map.harvs[creep.name].assigned_to; + } // add to miners set // allocate to proper node - // return node + return allocate_creep_to_mine(mine_map, creep); +} module.exports = { analyze_room : analyze_room, + refresh_room_mining_plan : refresh_room_mining_plan, + request_mining_target: request_mining_target }; + diff --git a/swampy1/util.js b/swampy1/util.js index 652c9b7..fc1cafb 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -51,11 +51,23 @@ function qPosDist(p1,p2) return xdist*xdist + ydist*ydist; } +//TODO: make it an obj with level, (0=off, 3=info, 1=error, 2=warning, 4=debug, 5=uper_debug) +let mk_notice = function(domain) +{ + let prefix = domain + " "; + return function(textinfo) + { + console.log(domain + textinfo); + }; +}; + + module.exports = { getRandomInt : getRandomInt, getRandomName : getRandomName, set_doing_state : set_doing_state, - qPosDist : qPosDist + qPosDist : qPosDist, + mk_notice : mk_notice }; From 7c66cf51918e82e5837e87c0919b129d5dffe5f7 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 16:30:46 -0500 Subject: [PATCH 018/123] Fix linting --- swampy1/.jshintrc | 22 +++++++++++++++++++++- swampy1/mining_planner.js | 5 +++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index 7b478a9..2ecd013 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -2,5 +2,25 @@ "esversion" : 6, "node" : true, "laxbreak" : true, - "eqnull" : true + "eqnull" : true, + "globals" : { + "ERR_NOT_IN_RANGE" : false, + "FIND_SOURCES" : false, + "FIND_STRUCTURES" : false, + "FIND_CONSTRUCTION_SITES" : false, + "FIND_SOURCES_ACTIVE" : false, + "FIND_MY_STRUCTURES" : false, + "RESOURCE_ENERGY" : false, + "STRUCTURE_TOWER" : false, + "STRUCTURE_EXTENSION" : false, + "STRUCTURE_SPAWN" : false, + + "BODYPART_COST" : false, + "MOVE" : false, + "WORK" : false, + "CARRY" : false, + + "Memory" : false, + "Game" : false + } } diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index c0cbd98..594d7a8 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -53,6 +53,11 @@ function dealloc_harv( mining_map, harv_rec ) //plan room mining function refresh_room_mining_plan(room_name) { + if(!Memory.mining_map || !Memory.mining_map[room_name]) + { + notice(`Cannot plan for ${room_name}: room analysis not done`); + return; + } let mine_map = Memory.mining_map[room_name]; // initialize mining plan if needed if( null == mine_map.harvs ) From e5b64cb2730ed6bc5a796270217c28725acecae9 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 16:33:33 -0500 Subject: [PATCH 019/123] Bug fixes --- swampy1/main.js | 2 +- swampy1/mining_planner.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index cb38e1f..8514a25 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -68,7 +68,7 @@ module.exports.loop = function () { if((Game.time % 25) === 0) { - mining_planner.refresh_room_mining_plan(); + mining_planner.refresh_room_mining_plan("Spawn1"); reports.report_creep_makes(); } diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 594d7a8..7c1465f 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -23,7 +23,7 @@ function analyze_room(room_name) } sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}}) ); - sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dis_to_spawn}`)); + sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dist}`)); // plan how many miners per node (more per distance? Path? Road? Etc. start with roundly robins) for( let ndx in sources) { From bdd4c0069d77ffd0bdcf37374708c350f6559c3e Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 16:59:10 -0500 Subject: [PATCH 020/123] Hook up harvesters to mining allocator --- swampy1/main.js | 5 ++++- swampy1/role.harvester.js | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index 8514a25..934facd 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -6,6 +6,9 @@ var reports = require('reports'); var mining_planner = require('mining_planner'); +roleHarvester.init(mining_planner.request_mining_target); + + function defendRoom(roomName) { var hostiles = Game.rooms[roomName].find(FIND_HOSTILE_CREEPS); @@ -68,7 +71,7 @@ module.exports.loop = function () { if((Game.time % 25) === 0) { - mining_planner.refresh_room_mining_plan("Spawn1"); + mining_planner.refresh_room_mining_plan(cur_room_name); reports.report_creep_makes(); } diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index dbcc75a..a1d51d2 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -1,24 +1,42 @@ "use strict"; const util = require('util'); -var roleHarvester = { +let roleHarvester = { + + alloc_func : null, + + init : function( work_allcator ) + { + roleHarvester.alloc_func = work_allcator; + }, /** @param {Creep} creep **/ run: function(creep) { - if(creep.carry.energy < creep.carryCapacity) { - var sources = creep.room.find(FIND_SOURCES_ACTIVE); - if(creep.memory.harvest_from_node == null || creep.memory.harvest_from_node > sources.length) - { - creep.memory.harvest_from_node = util.getRandomInt(0, sources.length); - } + + if(creep.memory.harvest_from_node == null ) + { + if( roleHarvester.alloc_func ) + { + creep.memory.harvest_from_node = roleHarvester.alloc_func(creep); + } + + if(creep.memory.harvest_from_node == null ) + { + var sources = creep.room.find(FIND_SOURCES_ACTIVE); + creep.memory.harvest_from_node = sources[util.getRandomInt(0, sources.length)].id; + } + } + + let source = Game.getObjectById(creep.memory.harvest_from_node); util.set_doing_state(creep, "harvest"); - if(creep.harvest(sources[creep.memory.harvest_from_node]) == ERR_NOT_IN_RANGE) { - creep.moveTo(sources[creep.memory.harvest_from_node]); + if(creep.harvest(source) == ERR_NOT_IN_RANGE) { + creep.moveTo(source); } } - else { + else + { var targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_EXTENSION From c96e9950e1961e4028444bd8b6579c81d4e0572a Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 1 Dec 2016 17:21:29 -0500 Subject: [PATCH 021/123] fix harv routine --- swampy1/role.harvester.js | 10 +++++----- swampy1/util.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index a1d51d2..a70141f 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -14,21 +14,21 @@ let roleHarvester = { run: function(creep) { if(creep.carry.energy < creep.carryCapacity) { - if(creep.memory.harvest_from_node == null ) + if(creep.memory.harvest_from_src_id == null ) { if( roleHarvester.alloc_func ) { - creep.memory.harvest_from_node = roleHarvester.alloc_func(creep); + creep.memory.harvest_from_src_id = roleHarvester.alloc_func(creep); } - if(creep.memory.harvest_from_node == null ) + if(creep.memory.harvest_from_src_id == null ) { var sources = creep.room.find(FIND_SOURCES_ACTIVE); - creep.memory.harvest_from_node = sources[util.getRandomInt(0, sources.length)].id; + creep.memory.harvest_from_src_id = sources[util.getRandomInt(0, sources.length)].id; } } - let source = Game.getObjectById(creep.memory.harvest_from_node); + let source = Game.getObjectById(creep.memory.harvest_from_src_id); util.set_doing_state(creep, "harvest"); if(creep.harvest(source) == ERR_NOT_IN_RANGE) { diff --git a/swampy1/util.js b/swampy1/util.js index fc1cafb..f87d688 100644 --- a/swampy1/util.js +++ b/swampy1/util.js @@ -57,7 +57,7 @@ let mk_notice = function(domain) let prefix = domain + " "; return function(textinfo) { - console.log(domain + textinfo); + console.log(prefix + textinfo); }; }; From 47dffa9509a8424aa6ca82d5706aaedb0663dc78 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 10:12:22 -0500 Subject: [PATCH 022/123] mining debug --- swampy1/mining_planner.js | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 7c1465f..7fcac90 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -1,5 +1,6 @@ "use strict"; const util = require('util'); +const _ = require('lodash'); const notice = util.mk_notice("mining_planner"); @@ -77,7 +78,7 @@ function refresh_room_mining_plan(room_name) //allocated harvs are all that is left now } -function allocate_creep_to_mine(mine_map, creep) +function _allocate_creep_to_mine(mine_map, creep) { let room_name = mine_map.room_name; //search through sources for which one has not enough harvies @@ -87,7 +88,7 @@ function allocate_creep_to_mine(mine_map, creep) { let source = mine_map.sources[source_id]; let num_needed = source.required_harvesters - source.harvs.length; - if( null == go_to_source || num_needed> most_needed) + if( null == go_to_source || num_needed > most_needed) { most_needed = num_needed; go_to_source = source; @@ -100,15 +101,36 @@ function allocate_creep_to_mine(mine_map, creep) } else { - //remove from source + //assign to source let harv_rec = {name:creep.name, assigned_to: go_to_source.id}; - notice(`Alloc harv ${creep.name} to source ${go_to_source.id} in room ${room_name}`); + notice(`Alloc harv ${creep.name} to source ${go_to_source.id} in room ${room_name} nn${most_needed}`); mine_map.sources[go_to_source.id].harvs[creep.name] = harv_rec; mine_map.harvs[creep.name] = harv_rec; return go_to_source.id; } } +function reset_mining_plan(room_name) +{ + if(!Memory.mining_map || !Memory.mining_map[room_name]) + { + notice(`Cannot refresh for ${room_name}: room analysis not done`); + return; + } + let mine_map = Memory.mining_map[room_name]; + // initialize mining plan if needed + if( null == mine_map.harvs ) + mine_map.harvs = {}; + else + { + // or else garbage collect for dead/missing harvesters + for(let name in mine_map.harvs) + { + dealloc_harv(mine_map, mine_map.harvs[name]); + } + } + //allocated harvs are all that is left now +} //request mining target(room, creep) function request_mining_target(creep) { @@ -126,13 +148,14 @@ function request_mining_target(creep) } // add to miners set // allocate to proper node - return allocate_creep_to_mine(mine_map, creep); + return _allocate_creep_to_mine(mine_map, creep); } module.exports = { analyze_room : analyze_room, refresh_room_mining_plan : refresh_room_mining_plan, - request_mining_target: request_mining_target + request_mining_target: request_mining_target, + reset_mining_plan : reset_mining_plan, }; From 297f2452a17697704ab72977e72d862dd1dc6f1b Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 10:23:41 -0500 Subject: [PATCH 023/123] lodash predefined? --- swampy1/mining_planner.js | 1 - 1 file changed, 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 7fcac90..a102270 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -1,6 +1,5 @@ "use strict"; const util = require('util'); -const _ = require('lodash'); const notice = util.mk_notice("mining_planner"); From dc30f6d68555778d7ab50220c1b60d1fd4f46e77 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 10:41:03 -0500 Subject: [PATCH 024/123] harsh cleanup added to loop --- swampy1/.jshintrc | 2 ++ swampy1/mining_planner.js | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index 2ecd013..621b31f 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -10,6 +10,8 @@ "FIND_CONSTRUCTION_SITES" : false, "FIND_SOURCES_ACTIVE" : false, "FIND_MY_STRUCTURES" : false, + "FIND_MY_CREEPS" : false, + "RESOURCE_ENERGY" : false, "STRUCTURE_TOWER" : false, "STRUCTURE_EXTENSION" : false, diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index a102270..1a16cbb 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -48,6 +48,11 @@ function dealloc_harv( mining_map, harv_rec ) //remove from map notice(`dealloc harv ${harv_rec.name} from map room ${mining_map.room_name}`); delete mining_map.harvs[harv_rec.name]; + + if(Memory.creeps[harv_rec.name]) + { + delete Memory.creeps[harv_rec.name].harvest_from_src_id; + } } //plan room mining @@ -128,7 +133,15 @@ function reset_mining_plan(room_name) dealloc_harv(mine_map, mine_map.harvs[name]); } } - //allocated harvs are all that is left now + + let room = Game.rooms[room_name]; + var room_creeps = room.find( FIND_MY_CREEPS); + for( let ndx in room_creeps) + { + let nm = room_creeps[ndx].name; + if( nm && Memory.creeps[nm] ) + delete Memory.creeps[ nm ].harvest_from_src_id; + } } //request mining target(room, creep) function request_mining_target(creep) From d2669002e57927ed95b945125785b2ac3c12c38f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 10:48:23 -0500 Subject: [PATCH 025/123] cannot length a hash directly --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 1a16cbb..9c751ac 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -91,7 +91,7 @@ function _allocate_creep_to_mine(mine_map, creep) for(let source_id in mine_map.sources) { let source = mine_map.sources[source_id]; - let num_needed = source.required_harvesters - source.harvs.length; + let num_needed = source.required_harvesters - Object.keys(source.harvs).length; if( null == go_to_source || num_needed > most_needed) { most_needed = num_needed; From 8b593fc47fe4a38fb8ef9951fd4f14a89a9668f3 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 10:52:12 -0500 Subject: [PATCH 026/123] tersen report by default --- swampy1/reports.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/swampy1/reports.js b/swampy1/reports.js index 3f3a74d..398c562 100644 --- a/swampy1/reports.js +++ b/swampy1/reports.js @@ -1,6 +1,6 @@ const util = require("util"); -function report_creep_makes() +function report_creep_makes(longform) { var toprint = []; for(var name in Game.creeps) { @@ -40,10 +40,23 @@ function report_creep_makes() return a.energy_rating - b.energy_rating; }); //print - for( let ndx in toprint) + if(!longform) { - let trp = toprint[ndx]; - console.log(`${trp.Crpname} [${trp.energy_rating}] ${trp.role} ${trp.model} (${trp.body_str})`); + let outp=""; + for( let ndx in toprint) + { + let trp = toprint[ndx]; + outp += `[${trp.energy_rating}]:${trp.role}|`; + } + console.log(outp); + } + else + { + for( let ndx in toprint) + { + let trp = toprint[ndx]; + console.log(`${trp.Crpname} [${trp.energy_rating}] ${trp.role} ${trp.model} (${trp.body_str})`); + } } } From 64a3ec4e9095ea00fc3a27d0f9079c1b6e10e3de Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 11:01:50 -0500 Subject: [PATCH 027/123] added better report --- swampy1/TODO.txt | 6 ++++++ swampy1/reports.js | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 swampy1/TODO.txt diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt new file mode 100644 index 0000000..8eb3d88 --- /dev/null +++ b/swampy1/TODO.txt @@ -0,0 +1,6 @@ + +all gatherers add to mining plan +builders idle as harvies(?) + more efficient building plan? terrible loop as of now + +killbot x 1 ? diff --git a/swampy1/reports.js b/swampy1/reports.js index 398c562..931b75c 100644 --- a/swampy1/reports.js +++ b/swampy1/reports.js @@ -42,11 +42,23 @@ function report_creep_makes(longform) //print if(!longform) { - let outp=""; - for( let ndx in toprint) + //compress energy,type => count + let compr = {}; + for(let ndx in toprint) { let trp = toprint[ndx]; - outp += `[${trp.energy_rating}]:${trp.role}|`; + let keyn = `${trp.energy_rating}-${trp.role}`; + if(!compr[keyn]) + compr[keyn] = 1; + else + ++ compr[keyn]; + } + + let outp=""; + for( let ndx in compr) + { + let count = toprint[ndx]; + outp += `${ndx}:${count}|`; } console.log(outp); } From 95590e81abe0e85e170fb1c6ef68eff29215b8bf Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 11:03:17 -0500 Subject: [PATCH 028/123] dumb bug fix --- swampy1/reports.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/reports.js b/swampy1/reports.js index 931b75c..7c80017 100644 --- a/swampy1/reports.js +++ b/swampy1/reports.js @@ -57,7 +57,7 @@ function report_creep_makes(longform) let outp=""; for( let ndx in compr) { - let count = toprint[ndx]; + let count = compr[ndx]; outp += `${ndx}:${count}|`; } console.log(outp); From 5fd9d4d9f91e5f2d8ea988e7137f4bf5907bde90 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 11:33:24 -0500 Subject: [PATCH 029/123] add killbot --- swampy1/.jshintrc | 3 +++ swampy1/lil_army.js | 10 +++++++++- swampy1/main.js | 8 ++++++-- swampy1/role.defense.js | 26 ++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 swampy1/role.defense.js diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index 621b31f..ab3ec14 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -11,6 +11,7 @@ "FIND_SOURCES_ACTIVE" : false, "FIND_MY_STRUCTURES" : false, "FIND_MY_CREEPS" : false, + "FIND_HOSTILE_CREEPS" : false, "RESOURCE_ENERGY" : false, "STRUCTURE_TOWER" : false, @@ -21,6 +22,8 @@ "MOVE" : false, "WORK" : false, "CARRY" : false, + "TOUGH" : false, + "ATTACK" : false, "Memory" : false, "Game" : false diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index e21d569..de8550d 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -11,6 +11,7 @@ let notice = function(textinfo) let _army_composition = [ {"model":"baby_harvester", "count" : 2}, + {"model":"killbot", "count" : 1}, {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, @@ -34,7 +35,14 @@ let models = "body" : [MOVE,CARRY,WORK,WORK], "role" : "upgrader", "prefix" : "bupgd_" - } + }, + "killbot" : { + "body" : [MOVE,MOVE,TOUGH,TOUGH,TOUGH,TOUGH, + TOUGH,TOUGH,TOUGH,TOUGH, + TOUGH,TOUGH,TOUGH,TOUGH,ATTACK], + "role" : "defense", + "prefix" : "bkill_" + } }; function _make_creep(model, spawn_name) diff --git a/swampy1/main.js b/swampy1/main.js index 934facd..1bee25c 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -1,6 +1,7 @@ var roleHarvester = require('role.harvester'); var roleUpgrader = require('role.upgrader'); var roleBuilder = require('role.builder'); +var roleDefense = require('role.defense'); var lil_army = require('lil_army'); var reports = require('reports'); var mining_planner = require('mining_planner'); @@ -61,11 +62,14 @@ module.exports.loop = function () { if(creep.memory.role == 'harvester') { roleHarvester.run(creep); } - if(creep.memory.role == 'upgrader') { + else if(creep.memory.role == 'upgrader') { roleUpgrader.run(creep); } - if(creep.memory.role == 'builder') { + else if(creep.memory.role == 'builder') { roleBuilder.run(creep); + } + else if(creep.memory.role == 'defense') { + roleDefense.run(creep); } } diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js new file mode 100644 index 0000000..a630ee6 --- /dev/null +++ b/swampy1/role.defense.js @@ -0,0 +1,26 @@ +"use strict"; +const util = require('util'); + +var roleDefense = { + + /** @param {Creep} creep **/ + run: function(creep) { + + var enemies = creep.room.find(FIND_HOSTILE_CREEPS); + if(enemies.length > 0) + { + util.set_doing_state(creep, "fight"); + + if(creep.attack(enemies[0]) === ERR_NOT_IN_RANGE) { + creep.moveTo(enemies[0]); + } + } + else + { + util.set_doing_state(creep, "lurk"); + } + } +}; + +module.exports = roleDefense; + From b226094508c3c6243026698464c15445b90dbe59 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 11:39:14 -0500 Subject: [PATCH 030/123] improve killbot recipe --- swampy1/lil_army.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index de8550d..2774b22 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -37,9 +37,10 @@ let models = "prefix" : "bupgd_" }, "killbot" : { - "body" : [MOVE,MOVE,TOUGH,TOUGH,TOUGH,TOUGH, - TOUGH,TOUGH,TOUGH,TOUGH, - TOUGH,TOUGH,TOUGH,TOUGH,ATTACK], + "body" : [ TOUGH,TOUGH,TOUGH,TOUGH,TOUGH, + TOUGH,TOUGH, + MOVE,MOVE,MOVE, + ATTACK], "role" : "defense", "prefix" : "bkill_" } From 5ae005b89f7f04cf8cc399595f69bb0394c9ef4f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 11:50:35 -0500 Subject: [PATCH 031/123] better recipe for killbot? --- swampy1/.jshintrc | 1 + swampy1/lil_army.js | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index ab3ec14..5491af8 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -24,6 +24,7 @@ "CARRY" : false, "TOUGH" : false, "ATTACK" : false, + "RANGED_ATTACK" : false, "Memory" : false, "Game" : false diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 2774b22..b8e104e 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -38,9 +38,8 @@ let models = }, "killbot" : { "body" : [ TOUGH,TOUGH,TOUGH,TOUGH,TOUGH, - TOUGH,TOUGH, - MOVE,MOVE,MOVE, - ATTACK], + MOVE,MOVE, + RANGED_ATTACK], "role" : "defense", "prefix" : "bkill_" } From 8efadfbced26c0ad6100525c1e6089ba9fbe3a0e Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 14:45:24 -0500 Subject: [PATCH 032/123] Squadronize defenses --- swampy1/lil_army.js | 2 +- swampy1/role.defense.js | 174 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 167 insertions(+), 9 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index b8e104e..c0bffc5 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -11,9 +11,9 @@ let notice = function(textinfo) let _army_composition = [ {"model":"baby_harvester", "count" : 2}, - {"model":"killbot", "count" : 1}, {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, + {"model":"killbot", "count" : 5}, {"model":"baby_harvester", "count" : 6}, {"model":"baby_builder", "count": 3}, {"model":"baby_upgrader", "count" : 3}, diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index a630ee6..7bf2be6 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -1,26 +1,184 @@ "use strict"; const util = require('util'); +const notice = util.mk_notice("defense"); + +// Memory.squads +function _form_new_squad(room_name) +{ + if(!Memory.squads) + Memory.squads = {}; + let new_squad = { + "name" : "squad_" + util.getRandomName(), + "room_name" : room_name, + "members_needed" : 5, + "members" : {}, + "target" : null, + "mode" : "form", // "form", "fight", "rally" + "rally_point" : {"x" : 25, "y" : 18}, + }; + Memory.squads[new_squad.name] = new_squad; + notice(`Form new squad ${new_squad.name}`); + return new_squad; +} + +function _squad_run_creep(squad, creep, target) +{ + if(squad.mode === "form" || squad.mode === "rally") + { + creep.moveTo( squad.rally_point.x, squad.rally_point.y); + } + else + { + if(creep.attack(target) === ERR_NOT_IN_RANGE) { + creep.moveTo(target); + } + } +} + +function _try_insert_creep_to_squad(creep, squad) +{ + if( squad.room_name != creep.pos.roomName ) + return false; + if( Object.keys(squad.members).length >= squad.members_needed ) + return false; + notice(`Added ${creep.name} to ${squad.name}`); + squad.members[creep.name] = creep.name; + creep.memory.belongs_to_squad = squad.name; + return true; +} +function _remove_creep_from_squad(creep_name, squad) +{ + let creep_mem = Memory.creeps[creep_name]; + if( !squad && creep_mem) + if(creep_mem.belongs_to_squad) + squad = Memory.squads[creep_mem.belongs_to_squad]; + notice(`Remove ${creep_name} from ${squad ? squad.name : "missing squad"}`); + if(squad) + delete squad.members[creep_name]; + if(creep_mem) + delete creep_mem.belongs_to_squad; +} +function _delete_squad(squad) +{ + notice(`Decommission squad ${squad.name}`); + for(let name in squad.members) + { + _remove_creep_from_squad(name, squad); + } + delete Memory.squads[squad.name]; +} + +function _plan_squad(squad_name, enemies) +{ + //garbage collect dead creeps + let squad = Memory.squads[squad_name]; + for( let name in squad.members) + if(null == Game.creeps[name]) + _remove_creep_from_squad(name, squad); + let squad_size = Object.keys(squad.members); + + if( squad.mode === "form" ) + { + if( squad_size < squad.members_needed ) + return; + squad.mode = "rally"; + } + if( squad_size < 1 ) + { + _delete_squad(squad); + return; + } + + if( squad.mode === "rally" ) + { + if(enemies.length > 0) + { + squad.mode = "fight"; + squad.target = enemies[0].id; + return; + } + } + if( squad.mode === "fight" ) + { + if( enemies.length === 0 ) + squad.mode = "rally"; + else + { + let real_target = Game.getObjectById(squad.target); + if( !Game.getObjectById(squad.target) ) + { + squad.target = enemies[0].id; + real_target = Game.getObjectById(squad.target); + } + for( let name in squad.members) + { + Game.creeps[name].real_target = real_target;//temporary memory??? + //TODO: stash lambda's in each creep + } + } + + } +} + +function plan_all_squads() +{ + if(!Memory.squads) + Memory.squads = {}; + var enemies_map = {}; + for(let name in Memory.squads) + { + let squad = Memory.squads[name]; + var enemies = enemies_map[squad.room_name]; + if(!enemies) + enemies = enemies_map[squad.room_name] = Game.rooms[squad.room_name].find(FIND_HOSTILE_CREEPS); + _plan_squad(name, enemies); + } +} + var roleDefense = { /** @param {Creep} creep **/ run: function(creep) { - - var enemies = creep.room.find(FIND_HOSTILE_CREEPS); - if(enemies.length > 0) + if(!creep.memory.belongs_to_squad || !Memory.squads[creep.memory.belongs_to_squad]) { - util.set_doing_state(creep, "fight"); + creep.memory.belongs_to_squad = null; + for(let name in Memory.squads) + { + if( _try_insert_creep_to_squad(creep, Memory.squads[name]) ) + break; + } + if( ! creep.memory.belongs_to_squad ) + { + let newsquad = _form_new_squad(creep.pos.roomName); + _try_insert_creep_to_squad(creep, newsquad); + } + } - if(creep.attack(enemies[0]) === ERR_NOT_IN_RANGE) { - creep.moveTo(enemies[0]); + if(creep.memory.belongs_to_squad) + { + let squad = Memory.squads[creep.memory.belongs_to_squad]; + let target = creep.real_target; + if( ! target) + { + notice('Stash didnt work'); + target = Game.getObjectById(squad.target); } + else + { + notice('Stash did work'); + } + _squad_run_creep(squad, creep, target); } else { - util.set_doing_state(creep, "lurk"); + notice("Could not assign creep ${creep.name} to any squadron!!!"); } } }; -module.exports = roleDefense; +module.exports = { + plan_all_squads : plan_all_squads, + roleDefense : roleDefense, +}; From 31010663d51bf157e5e6690a816ad91fb3aa14ee Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 14:51:57 -0500 Subject: [PATCH 033/123] bugfixes --- swampy1/main.js | 2 +- swampy1/mining_planner.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/swampy1/main.js b/swampy1/main.js index 1bee25c..3addfcb 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -34,7 +34,7 @@ module.exports.loop = function () { if( null == Memory.mining_map) { //one time only? - mining_planner.analyze_room("Spawn1"); + mining_planner.analyze_room("sim"); } var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 9c751ac..b3cf6b9 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -21,6 +21,7 @@ function analyze_room(room_name) let source = sources[ndx]; source.dis_to_spawn = util.qPosDist(spawn.pos, source.pos); } + //sort nearest to furthest sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}}) ); sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dist}`)); From a7d16eab70e30cd00dd8e3ac80b0e246182de51d Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 14:55:50 -0500 Subject: [PATCH 034/123] bugfixes for mining init --- swampy1/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index 3addfcb..91a35d7 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -31,10 +31,10 @@ module.exports.loop = function () { let cur_room = Game.rooms[cur_room_name]; lil_army.one_run("Spawn1"); - if( null == Memory.mining_map) + if( null == Memory.mining_map || null == Memory.mining_map[cur_room_name] ) { //one time only? - mining_planner.analyze_room("sim"); + mining_planner.analyze_room(cur_room_name); } var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; From 14feeef9dc6e84164b3eebec3e71baf9d4bca00f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 14:59:42 -0500 Subject: [PATCH 035/123] Improve build order --- swampy1/lil_army.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index c0bffc5..4fc96ad 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -12,10 +12,12 @@ let _army_composition = [ {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, - {"model":"baby_upgrader", "count" : 1}, {"model":"killbot", "count" : 5}, + {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, {"model":"baby_builder", "count": 3}, + {"model":"baby_upgrader", "count" : 2}, + {"model":"killbot", "count" : 9}, {"model":"baby_upgrader", "count" : 3}, ]; From 07656558497d27bc506a699aacb5e6edfb5a60cf Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 15:02:23 -0500 Subject: [PATCH 036/123] defense bugfix --- swampy1/role.defense.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index 7bf2be6..d28530d 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -136,7 +136,7 @@ function plan_all_squads() } } -var roleDefense = { +var run_roleDefense = { /** @param {Creep} creep **/ run: function(creep) { @@ -179,6 +179,6 @@ var roleDefense = { module.exports = { plan_all_squads : plan_all_squads, - roleDefense : roleDefense, + run : run_roleDefense, }; From 3c29ffef82dd94e7549f467c943ab7d798f18b05 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 15:05:35 -0500 Subject: [PATCH 037/123] push just to cause reload...sad --- swampy1/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/swampy1/main.js b/swampy1/main.js index 91a35d7..cc4e851 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -80,3 +80,4 @@ module.exports.loop = function () { } }; +// From c34d82772f8d219ee57e8671ae0f35e5076d7bec Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 2 Dec 2016 15:09:54 -0500 Subject: [PATCH 038/123] fix role defense --- swampy1/role.defense.js | 59 +++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index d28530d..c700b2e 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -136,46 +136,43 @@ function plan_all_squads() } } -var run_roleDefense = { - - /** @param {Creep} creep **/ - run: function(creep) { - if(!creep.memory.belongs_to_squad || !Memory.squads[creep.memory.belongs_to_squad]) +function run_roleDefense(creep) +{ + if(!creep.memory.belongs_to_squad || !Memory.squads[creep.memory.belongs_to_squad]) + { + creep.memory.belongs_to_squad = null; + for(let name in Memory.squads) { - creep.memory.belongs_to_squad = null; - for(let name in Memory.squads) - { - if( _try_insert_creep_to_squad(creep, Memory.squads[name]) ) - break; - } - if( ! creep.memory.belongs_to_squad ) - { - let newsquad = _form_new_squad(creep.pos.roomName); - _try_insert_creep_to_squad(creep, newsquad); - } + if( _try_insert_creep_to_squad(creep, Memory.squads[name]) ) + break; } + if( ! creep.memory.belongs_to_squad ) + { + let newsquad = _form_new_squad(creep.pos.roomName); + _try_insert_creep_to_squad(creep, newsquad); + } + } - if(creep.memory.belongs_to_squad) + if(creep.memory.belongs_to_squad) + { + let squad = Memory.squads[creep.memory.belongs_to_squad]; + let target = creep.real_target; + if( ! target) { - let squad = Memory.squads[creep.memory.belongs_to_squad]; - let target = creep.real_target; - if( ! target) - { - notice('Stash didnt work'); - target = Game.getObjectById(squad.target); - } - else - { - notice('Stash did work'); - } - _squad_run_creep(squad, creep, target); + notice('Stash didnt work'); + target = Game.getObjectById(squad.target); } else { - notice("Could not assign creep ${creep.name} to any squadron!!!"); + notice('Stash did work'); } + _squad_run_creep(squad, creep, target); } -}; + else + { + notice("Could not assign creep ${creep.name} to any squadron!!!"); + } +} module.exports = { plan_all_squads : plan_all_squads, From e4ff626f483364be4c9ae3d708b3889866296574 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:01:37 -0500 Subject: [PATCH 039/123] initialize mining map better --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index b3cf6b9..bf14bf7 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -10,7 +10,7 @@ function analyze_room(room_name) { if( null == Memory.mining_map) Memory.mining_map = {}; - Memory.mining_map[room_name] = {room_name:room_name}; + Memory.mining_map[room_name] = {room_name:room_name, harvs:{}}; let room = Game.rooms[room_name]; var spawn = room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_SPAWN}})[0]; let sources = room.find(FIND_SOURCES); From d093cd1ef56a9190ae86a9fef6234dd93f666de6 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:10:53 -0500 Subject: [PATCH 040/123] I suppose game objects are truly immutable. oh well --- swampy1/package.json | 7 ++++--- swampy1/role.defense.js | 25 ++++++++----------------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/swampy1/package.json b/swampy1/package.json index aa6aad3..2bb08b4 100644 --- a/swampy1/package.json +++ b/swampy1/package.json @@ -3,12 +3,13 @@ "version": "1.0.0", "description": "", "main": "main.js", - "dependencies": { + "dependencies": {}, + "devDependencies": { + "jshint": "^2.9.4" }, - "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "lint" : "jshint *.js" + "lint": "jshint *.js" }, "author": "", "license": "ISC" diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index c700b2e..a430725 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -105,17 +105,17 @@ function _plan_squad(squad_name, enemies) squad.mode = "rally"; else { - let real_target = Game.getObjectById(squad.target); + //let real_target = Game.getObjectById(squad.target); if( !Game.getObjectById(squad.target) ) { squad.target = enemies[0].id; - real_target = Game.getObjectById(squad.target); - } - for( let name in squad.members) - { - Game.creeps[name].real_target = real_target;//temporary memory??? - //TODO: stash lambda's in each creep + //real_target = Game.getObjectById(squad.target); } + //for( let name in squad.members) + //{ + // Game.creeps[name].real_target = real_target;//temporary memory??? + // //TODO: stash lambda's in each creep + //} } } @@ -156,16 +156,7 @@ function run_roleDefense(creep) if(creep.memory.belongs_to_squad) { let squad = Memory.squads[creep.memory.belongs_to_squad]; - let target = creep.real_target; - if( ! target) - { - notice('Stash didnt work'); - target = Game.getObjectById(squad.target); - } - else - { - notice('Stash did work'); - } + let target = Game.getObjectById(squad.target); _squad_run_creep(squad, creep, target); } else From 44959441bd64abadaf780e07b527606a8ce5d484 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:15:38 -0500 Subject: [PATCH 041/123] Add warmaking to main loop --- swampy1/main.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/swampy1/main.js b/swampy1/main.js index cc4e851..c61c626 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -37,6 +37,9 @@ module.exports.loop = function () { mining_planner.analyze_room(cur_room_name); } + //War: + roleDefense.plan_all_squads(); + var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; if(tower) { var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { From 9911fe6684e134fdfccfbd2682cd122487568865 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:22:32 -0500 Subject: [PATCH 042/123] rangedAttack needs to be used for shooting --- swampy1/role.defense.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index a430725..888eb1c 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -30,7 +30,7 @@ function _squad_run_creep(squad, creep, target) } else { - if(creep.attack(target) === ERR_NOT_IN_RANGE) { + if(creep.rangedAttack(target) === ERR_NOT_IN_RANGE) { creep.moveTo(target); } } From fb0d1e6a53200f72f7a050e329cdf3f1bf048e82 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:27:10 -0500 Subject: [PATCH 043/123] attempt to make fast drones --- swampy1/lil_army.js | 6 +++--- swampy1/role.defense.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 4fc96ad..9952902 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -12,7 +12,7 @@ let _army_composition = [ {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, - {"model":"killbot", "count" : 5}, + {"model":"killbot", "count" : 8}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, {"model":"baby_builder", "count": 3}, @@ -39,8 +39,8 @@ let models = "prefix" : "bupgd_" }, "killbot" : { - "body" : [ TOUGH,TOUGH,TOUGH,TOUGH,TOUGH, - MOVE,MOVE, + "body" : [ TOUGH,TOUGH,TOUGH, + MOVE,MOVE,MOVE, RANGED_ATTACK], "role" : "defense", "prefix" : "bkill_" diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index 888eb1c..9d43e56 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -11,7 +11,7 @@ function _form_new_squad(room_name) let new_squad = { "name" : "squad_" + util.getRandomName(), "room_name" : room_name, - "members_needed" : 5, + "members_needed" : 8, "members" : {}, "target" : null, "mode" : "form", // "form", "fight", "rally" From 85ea1a8492ea58f5bfdc0b19730c77005d13ae5a Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 19:29:14 -0500 Subject: [PATCH 044/123] Reap squads more effectively --- swampy1/role.defense.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index 9d43e56..110f9bb 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -78,6 +78,12 @@ function _plan_squad(squad_name, enemies) _remove_creep_from_squad(name, squad); let squad_size = Object.keys(squad.members); + if( squad_size < 1 ) + { + _delete_squad(squad); + return; + } + if( squad.mode === "form" ) { if( squad_size < squad.members_needed ) From ff6b36ecd4531f41207e50c455456408f42ec184 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:01:55 -0500 Subject: [PATCH 045/123] debug defenses --- swampy1/.jshintrc | 2 ++ swampy1/role.defense.js | 18 +++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index 5491af8..562f741 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -5,6 +5,8 @@ "eqnull" : true, "globals" : { "ERR_NOT_IN_RANGE" : false, + "OK" : false, + "FIND_SOURCES" : false, "FIND_STRUCTURES" : false, "FIND_CONSTRUCTION_SITES" : false, diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index 110f9bb..ed852ca 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -15,7 +15,7 @@ function _form_new_squad(room_name) "members" : {}, "target" : null, "mode" : "form", // "form", "fight", "rally" - "rally_point" : {"x" : 25, "y" : 18}, + "rally_point" : {"x" : 20, "y" : 27}, }; Memory.squads[new_squad.name] = new_squad; notice(`Form new squad ${new_squad.name}`); @@ -30,9 +30,17 @@ function _squad_run_creep(squad, creep, target) } else { - if(creep.rangedAttack(target) === ERR_NOT_IN_RANGE) { + let result = creep.rangedAttack(target); + if( result === OK ) + { + } + else if(creep.rangedAttack(target) === ERR_NOT_IN_RANGE) { creep.moveTo(target); } + else + { + notice(`War Fail ${creep.name}.rangedAttack = ${result}`); + } } } @@ -102,6 +110,7 @@ function _plan_squad(squad_name, enemies) { squad.mode = "fight"; squad.target = enemies[0].id; + notice(`Squad ${squad.name} to Fight ${squad.target}`); return; } } @@ -117,11 +126,6 @@ function _plan_squad(squad_name, enemies) squad.target = enemies[0].id; //real_target = Game.getObjectById(squad.target); } - //for( let name in squad.members) - //{ - // Game.creeps[name].real_target = real_target;//temporary memory??? - // //TODO: stash lambda's in each creep - //} } } From c3cfec13a8817a149a00092de07f2f6c5ffb6178 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:03:06 -0500 Subject: [PATCH 046/123] Lol, overbuilt bots cant fight... --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 9952902..0ae697f 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -40,7 +40,7 @@ let models = }, "killbot" : { "body" : [ TOUGH,TOUGH,TOUGH, - MOVE,MOVE,MOVE, + MOVE,MOVE, RANGED_ATTACK], "role" : "defense", "prefix" : "bkill_" From 6a4d08f19613b7b819df5ff541e8f420364df7fa Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:05:57 -0500 Subject: [PATCH 047/123] dont manage during spawn --- swampy1/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swampy1/main.js b/swampy1/main.js index c61c626..dfc150b 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -62,6 +62,8 @@ module.exports.loop = function () { for(var name in Game.creeps) { var creep = Game.creeps[name]; + if(creep.spawning) + continue; if(creep.memory.role == 'harvester') { roleHarvester.run(creep); } From c28b8e9ee54bb28983fb73c3406f0cfae2fe0f3a Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:12:41 -0500 Subject: [PATCH 048/123] Fix squad size check related thins --- swampy1/role.defense.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index ed852ca..d3f95be 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -84,26 +84,23 @@ function _plan_squad(squad_name, enemies) for( let name in squad.members) if(null == Game.creeps[name]) _remove_creep_from_squad(name, squad); - let squad_size = Object.keys(squad.members); - - if( squad_size < 1 ) - { - _delete_squad(squad); - return; - } + let squad_size = Object.keys(squad.members).length; if( squad.mode === "form" ) { if( squad_size < squad.members_needed ) return; + notice(`Squad ${squad.name} has completed all ${squad_size} members of ${squad.members_needed} needed`); squad.mode = "rally"; } + if( squad_size < 1 ) { _delete_squad(squad); return; } + if( squad.mode === "rally" ) { if(enemies.length > 0) From 03d062bb5d364e832f989bedb98c91f9fb0faea9 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:29:06 -0500 Subject: [PATCH 049/123] add auto build for bot body --- swampy1/lil_army.js | 52 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 0ae697f..0e69f80 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -39,11 +39,35 @@ let models = "prefix" : "bupgd_" }, "killbot" : { - "body" : [ TOUGH,TOUGH,TOUGH, - MOVE,MOVE, - RANGED_ATTACK], + "body" : [ TOUGH, MOVE, MOVE, RANGED_ATTACK ], "role" : "defense", - "prefix" : "bkill_" + "prefix" : "bkill_", + "build" : function(energy) + { + //proportions of TOUGH=10, MOVE=50, RANGED_ATTACK=150 + // for every 400, make: 5 tough, 4 move, 1 RA + let bwant = { + RANGED_ATTACK : parseInt(energy / 400), + MOVE : parseInt(energy / 100), + TOUGH : parseInt(energy / 80) + }; + let bmap = { RANGED_ATTACK:0, MOVE:0, TOUGH:0}; + for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) + { + while(energy > 0) + { + bmap[adding_part] += 1; + energy -= BODYPART_COST[adding_part]; + } + } + let ret_body = []; + for( let adding_part in [TOUGH, MOVE, RANGED_ATTACK] ) + { + for(let x=0; x< bmap[adding_part]; ++x) + ret_body.push(adding_part); + } + return ret_body; + } } }; @@ -64,13 +88,21 @@ function _make_creep(model, spawn_name) console.log(`Energy Class updated to ${Memory.max_energy}`); } - while(energy_to_consume >= BODYPART_COST[part]) + if( modl.build) + { + body_spec = modl.build(energy_to_consume); + energy_used = energy_to_consume;//TODO: do better + } + else { - energy_to_consume -= BODYPART_COST[part]; - energy_used += BODYPART_COST[part]; - body_spec.push(part); - at_ndx = (at_ndx + 1) % mx_ndx; - part = getpart(at_ndx); + while(energy_to_consume >= BODYPART_COST[part]) + { + energy_to_consume -= BODYPART_COST[part]; + energy_used += BODYPART_COST[part]; + body_spec.push(part); + at_ndx = (at_ndx + 1) % mx_ndx; + part = getpart(at_ndx); + } } if( 0 !== Game.spawns[spawn_name].canCreateCreep(body_spec) ) From 7d65547d0c1df45dcaf6d88556c88169c3847963 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Sat, 3 Dec 2016 20:40:28 -0500 Subject: [PATCH 050/123] killbot debug --- swampy1/lil_army.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 0e69f80..31b26aa 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -105,9 +105,13 @@ function _make_creep(model, spawn_name) } } - if( 0 !== Game.spawns[spawn_name].canCreateCreep(body_spec) ) + let why_not_can = Game.spawns[spawn_name].canCreateCreep(body_spec); + if( 0 !== why_not_can ) + { + if( why_not_can !== -6) + notice( `Failed to spec build ${body_spec.join(",")} : ${why_not_can}}` ); return; - + } let newname = modl.prefix + util.getRandomName(); notice("Making a \"" + model + "\" " + newname + ` (${energy_used})`); //notice(" spec = " + body_spec.join(",")); From 40ebe968da3713f3c4ea4ebb4b2869714e28b22f Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:42:30 -0500 Subject: [PATCH 051/123] fix kiillbuilder --- swampy1/lil_army.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 31b26aa..388d0e6 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -54,10 +54,15 @@ let models = let bmap = { RANGED_ATTACK:0, MOVE:0, TOUGH:0}; for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) { - while(energy > 0) + for(let x = 0; x < bwant[adding_part]; ++x ) { - bmap[adding_part] += 1; - energy -= BODYPART_COST[adding_part]; + if( energy >= BODYPART_COST[adding_part]) + { + bmap[adding_part] += 1; + energy -= BODYPART_COST[adding_part]; + } + else + break; } } let ret_body = []; @@ -88,7 +93,7 @@ function _make_creep(model, spawn_name) console.log(`Energy Class updated to ${Memory.max_energy}`); } - if( modl.build) + if( modl.build != null ) { body_spec = modl.build(energy_to_consume); energy_used = energy_to_consume;//TODO: do better From 397f0780e2bf0a2733ac920f675218d0c2fd715e Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:54:11 -0500 Subject: [PATCH 052/123] debug more --- swampy1/lil_army.js | 3 +++ swampy1/mining_planner.js | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 388d0e6..c817e09 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -52,6 +52,7 @@ let models = TOUGH : parseInt(energy / 80) }; let bmap = { RANGED_ATTACK:0, MOVE:0, TOUGH:0}; +notice(JSON.stringify(bwant)); for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) { for(let x = 0; x < bwant[adding_part]; ++x ) @@ -65,12 +66,14 @@ let models = break; } } +notice(JSON.stringify(bmap)); let ret_body = []; for( let adding_part in [TOUGH, MOVE, RANGED_ATTACK] ) { for(let x=0; x< bmap[adding_part]; ++x) ret_body.push(adding_part); } +notice(JSON.stringify(ret_body)); return ret_body; } } diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index bf14bf7..33f43a7 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -87,16 +87,16 @@ function _allocate_creep_to_mine(mine_map, creep) { let room_name = mine_map.room_name; //search through sources for which one has not enough harvies - let most_needed = null; + //let most_needed = null; let go_to_source = null; for(let source_id in mine_map.sources) { let source = mine_map.sources[source_id]; let num_needed = source.required_harvesters - Object.keys(source.harvs).length; - if( null == go_to_source || num_needed > most_needed) + if( null == go_to_source || num_needed > 0) { - most_needed = num_needed; go_to_source = source; + break; } } if(!go_to_source) @@ -108,7 +108,7 @@ function _allocate_creep_to_mine(mine_map, creep) { //assign to source let harv_rec = {name:creep.name, assigned_to: go_to_source.id}; - notice(`Alloc harv ${creep.name} to source ${go_to_source.id} in room ${room_name} nn${most_needed}`); + notice(`Alloc harv ${creep.name} to source ${go_to_source.id} in room ${room_name} `); mine_map.sources[go_to_source.id].harvs[creep.name] = harv_rec; mine_map.harvs[creep.name] = harv_rec; return go_to_source.id; From d2e441d7ea7dfa2211be993867279282e7ab560e Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:56:21 -0500 Subject: [PATCH 053/123] pushing debug commits is bad testing but oh well --- swampy1/lil_army.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index c817e09..72a8aee 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -51,7 +51,10 @@ let models = MOVE : parseInt(energy / 100), TOUGH : parseInt(energy / 80) }; + if(bwant[RANGED_ATTACK] < 1) + bwant[RANGED_ATTACK] = 1; let bmap = { RANGED_ATTACK:0, MOVE:0, TOUGH:0}; +notice(`for energy at ${energy} want:`); notice(JSON.stringify(bwant)); for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) { @@ -61,6 +64,7 @@ notice(JSON.stringify(bwant)); { bmap[adding_part] += 1; energy -= BODYPART_COST[adding_part]; +notice(`add on ${adding_part}, ${energy} is left`); } else break; From dfd7df30be14bdcba118fc2134f10adaec5c7637 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:58:34 -0500 Subject: [PATCH 054/123] till debugging --- swampy1/lil_army.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 72a8aee..4ed6745 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -47,13 +47,13 @@ let models = //proportions of TOUGH=10, MOVE=50, RANGED_ATTACK=150 // for every 400, make: 5 tough, 4 move, 1 RA let bwant = { - RANGED_ATTACK : parseInt(energy / 400), - MOVE : parseInt(energy / 100), - TOUGH : parseInt(energy / 80) + "ranged_attack" : parseInt(energy / 400), + "move" : parseInt(energy / 100), + "tough" : parseInt(energy / 80) }; if(bwant[RANGED_ATTACK] < 1) bwant[RANGED_ATTACK] = 1; - let bmap = { RANGED_ATTACK:0, MOVE:0, TOUGH:0}; + let bmap = { "ranged_attack":0, "move":0, "tough":0}; notice(`for energy at ${energy} want:`); notice(JSON.stringify(bwant)); for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) From 0ba1c1bb655d3c76af9d085de12b920518bd64b6 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 20:59:37 -0500 Subject: [PATCH 055/123] still debugging 2 --- swampy1/lil_army.js | 1 + 1 file changed, 1 insertion(+) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 4ed6745..5679b03 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -60,6 +60,7 @@ notice(JSON.stringify(bwant)); { for(let x = 0; x < bwant[adding_part]; ++x ) { +notice(`add on ${adding_part}?, ${energy} is left`); if( energy >= BODYPART_COST[adding_part]) { bmap[adding_part] += 1; From b0552664ad1d8aec02cdd285be4f0847868744e9 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 21:00:29 -0500 Subject: [PATCH 056/123] still debugging 3 --- swampy1/lil_army.js | 1 + 1 file changed, 1 insertion(+) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 5679b03..498ee67 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -58,6 +58,7 @@ notice(`for energy at ${energy} want:`); notice(JSON.stringify(bwant)); for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) { +notice(`consider ${adding_part};; ${energy} is left;; want ${bwant[adding_part]}`); for(let x = 0; x < bwant[adding_part]; ++x ) { notice(`add on ${adding_part}?, ${energy} is left`); From d21853a2fc3203ab834f4917e65f102254e735f9 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 21:01:41 -0500 Subject: [PATCH 057/123] still debugging 4 --- swampy1/lil_army.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 498ee67..775f5f1 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -56,7 +56,7 @@ let models = let bmap = { "ranged_attack":0, "move":0, "tough":0}; notice(`for energy at ${energy} want:`); notice(JSON.stringify(bwant)); - for( let adding_part in [RANGED_ATTACK, MOVE, TOUGH] ) + for( let adding_part in {ranged_attack:1, move:1, tough:1] ) { notice(`consider ${adding_part};; ${energy} is left;; want ${bwant[adding_part]}`); for(let x = 0; x < bwant[adding_part]; ++x ) @@ -74,7 +74,7 @@ notice(`add on ${adding_part}, ${energy} is left`); } notice(JSON.stringify(bmap)); let ret_body = []; - for( let adding_part in [TOUGH, MOVE, RANGED_ATTACK] ) + for( let adding_part in {tough:1, move:1, ranged_attack:1} ) { for(let x=0; x< bmap[adding_part]; ++x) ret_body.push(adding_part); From 95a51eec982ea5dc277b4febf6836c55a4700399 Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 21:02:13 -0500 Subject: [PATCH 058/123] still debugging 5 --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 775f5f1..f9458b0 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -56,7 +56,7 @@ let models = let bmap = { "ranged_attack":0, "move":0, "tough":0}; notice(`for energy at ${energy} want:`); notice(JSON.stringify(bwant)); - for( let adding_part in {ranged_attack:1, move:1, tough:1] ) + for( let adding_part in {ranged_attack:1, move:1, tough:1} ) { notice(`consider ${adding_part};; ${energy} is left;; want ${bwant[adding_part]}`); for(let x = 0; x < bwant[adding_part]; ++x ) From afd8688594ac430dccd4b53cac25a1bda14627fe Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 21:04:41 -0500 Subject: [PATCH 059/123] things to take away: js for loops use keys even on arrays. variables dont work for key names in object literals. --- swampy1/lil_army.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index f9458b0..8039c73 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -54,32 +54,25 @@ let models = if(bwant[RANGED_ATTACK] < 1) bwant[RANGED_ATTACK] = 1; let bmap = { "ranged_attack":0, "move":0, "tough":0}; -notice(`for energy at ${energy} want:`); -notice(JSON.stringify(bwant)); for( let adding_part in {ranged_attack:1, move:1, tough:1} ) { -notice(`consider ${adding_part};; ${energy} is left;; want ${bwant[adding_part]}`); for(let x = 0; x < bwant[adding_part]; ++x ) { -notice(`add on ${adding_part}?, ${energy} is left`); if( energy >= BODYPART_COST[adding_part]) { bmap[adding_part] += 1; energy -= BODYPART_COST[adding_part]; -notice(`add on ${adding_part}, ${energy} is left`); } else break; } } -notice(JSON.stringify(bmap)); let ret_body = []; for( let adding_part in {tough:1, move:1, ranged_attack:1} ) { for(let x=0; x< bmap[adding_part]; ++x) ret_body.push(adding_part); } -notice(JSON.stringify(ret_body)); return ret_body; } } From 50072bab096a225ec8951e797e09df034bcfcbab Mon Sep 17 00:00:00 2001 From: seer Date: Sat, 3 Dec 2016 21:10:04 -0500 Subject: [PATCH 060/123] Dont assign all to first --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 33f43a7..7a1f1d8 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -93,7 +93,7 @@ function _allocate_creep_to_mine(mine_map, creep) { let source = mine_map.sources[source_id]; let num_needed = source.required_harvesters - Object.keys(source.harvs).length; - if( null == go_to_source || num_needed > 0) + if( num_needed > 0) { go_to_source = source; break; From 8d8f1476387d2fd092d16885505a6235e8b0a1f9 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 10:44:43 -0500 Subject: [PATCH 061/123] dont build killbots till up to 500 energy cap? --- swampy1/lil_army.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 8039c73..300f4a1 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -19,6 +19,7 @@ let _army_composition = {"model":"baby_upgrader", "count" : 2}, {"model":"killbot", "count" : 9}, {"model":"baby_upgrader", "count" : 3}, + {"model":"baby_harvester", "count" : 9}, ]; let models = @@ -41,6 +42,7 @@ let models = "killbot" : { "body" : [ TOUGH, MOVE, MOVE, RANGED_ATTACK ], "role" : "defense", + "min_energy" : 500, "prefix" : "bkill_", "build" : function(energy) { @@ -78,11 +80,10 @@ let models = } }; -function _make_creep(model, spawn_name) +function _make_creep(model, spawn_name, energy_to_consume) { let modl = models[model]; let body_spec = []; - let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; let at_ndx = 0; let mx_ndx = modl.body.length; let getpart = at_ndx => modl.body[at_ndx]; @@ -130,13 +131,14 @@ function _make_creep(model, spawn_name) return ret; } -function next_missing(inventory) +function next_missing(inventory, energy) { for(let x=0; x<_army_composition.length; ++x ) { let spec = _army_composition[x]; let cur_count = inventory[spec.model]; - if( cur_count < spec.count ) + if( cur_count < spec.count && + (null == spec.min_energy || energy >= spec.min_energy)) { return spec.model; } @@ -171,10 +173,11 @@ function one_run(spawn_name) } } + let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; let inv = compute_inventory(); - let needed = next_missing(inv); + let needed = next_missing(inv, energy_to_consume); if(needed) - _make_creep(needed, spawn_name); + _make_creep(needed, spawn_name, energy_to_consume); } module.exports = { From 788d704f83eba16f50ab7d991a25189c2d7c281d Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 10:51:12 -0500 Subject: [PATCH 062/123] fix bug --- swampy1/lil_army.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 300f4a1..2ac9a73 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -137,8 +137,9 @@ function next_missing(inventory, energy) { let spec = _army_composition[x]; let cur_count = inventory[spec.model]; + let min_energy_needed = models[ spec.model ].min_energy; if( cur_count < spec.count && - (null == spec.min_energy || energy >= spec.min_energy)) + (null == min_energy_needed || energy >= min_energy_needed)) { return spec.model; } From d85bea3146bd0ff5dc6b59d78b58cea1fa854f9e Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 11:10:22 -0500 Subject: [PATCH 063/123] change builder recipe, more carry per unit of other stuff --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 2ac9a73..fb31c19 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -25,7 +25,7 @@ let _army_composition = let models = { "baby_builder" : { - "body" : [MOVE,WORK,CARRY,WORK], + "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,WORK], "role" : "builder", "prefix" : "bbldr_" }, From 35a74667aa8db32ede4d20c7f48845cc8d272782 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 11:13:47 -0500 Subject: [PATCH 064/123] improve builder and upgrader recipe again --- swampy1/lil_army.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index fb31c19..470e6c0 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -25,12 +25,12 @@ let _army_composition = let models = { "baby_builder" : { - "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,WORK], + "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], "role" : "builder", "prefix" : "bbldr_" }, "baby_harvester" : { - "body" : [MOVE,MOVE,WORK,CARRY,CARRY], + "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], "role" : "harvester", "prefix" : "bharv_" }, From 04c2634927a4a33dffba31563b01791ed38b1743 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 11:19:21 -0500 Subject: [PATCH 065/123] whoops, changed wrong recipe --- swampy1/lil_army.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 470e6c0..6754afd 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -30,12 +30,12 @@ let models = "prefix" : "bbldr_" }, "baby_harvester" : { - "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], + "body" : [MOVE,MOVE,WORK,CARRY,CARRY,CARRY], "role" : "harvester", "prefix" : "bharv_" }, "baby_upgrader" : { - "body" : [MOVE,CARRY,WORK,WORK], + "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], "role" : "upgrader", "prefix" : "bupgd_" }, From e686796d5580f42831a215d6b2cf0963cbdbcb38 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 11:40:43 -0500 Subject: [PATCH 066/123] need more harvesters --- swampy1/TODO.txt | 2 ++ swampy1/lil_army.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 8eb3d88..b869903 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,4 +1,6 @@ +harverster: dont short hit offloads !!! + all gatherers add to mining plan builders idle as harvies(?) more efficient building plan? terrible loop as of now diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 6754afd..89999f5 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -12,9 +12,9 @@ let _army_composition = [ {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, - {"model":"killbot", "count" : 8}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, + {"model":"killbot", "count" : 8}, {"model":"baby_builder", "count": 3}, {"model":"baby_upgrader", "count" : 2}, {"model":"killbot", "count" : 9}, From ce552ba0e8d779d76924084126fadcd850699dd2 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:20:01 -0500 Subject: [PATCH 067/123] slight opimization of harvesting: dump all energy before going back to harvest --- swampy1/role.harvester.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index a70141f..241bcca 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -11,9 +11,25 @@ let roleHarvester = { }, /** @param {Creep} creep **/ - run: function(creep) { - if(creep.carry.energy < creep.carryCapacity) { + run: function(creep) + { + if( creep.memory.mode === "retrieve") + { + if(creep.carry.energy === 0 ) + { + creep.memory.mode = "harvest"; + } + } + else if( creep.memory.mode === "harvest" ) + { + if(creep.carry.energy >= creep.carryCapacity) + { + creep.memory.mode = "retrieve"; + } + } + if( creep.memory.mode === "harvest" ) + { if(creep.memory.harvest_from_src_id == null ) { if( roleHarvester.alloc_func ) From 6cdb3e1c80ede4ea4c5ae7d4b1a45513a72494b9 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:25:26 -0500 Subject: [PATCH 068/123] hrm, something wrong with harvest logic --- swampy1/lil_army.js | 5 ++--- swampy1/role.harvester.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 89999f5..7ad5937 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -14,12 +14,11 @@ let _army_composition = {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, - {"model":"killbot", "count" : 8}, {"model":"baby_builder", "count": 3}, {"model":"baby_upgrader", "count" : 2}, - {"model":"killbot", "count" : 9}, {"model":"baby_upgrader", "count" : 3}, - {"model":"baby_harvester", "count" : 9}, + {"model":"baby_harvester", "count" : 20}, + {"model":"killbot", "count" : 9}, ]; let models = diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 241bcca..752ab62 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -15,7 +15,7 @@ let roleHarvester = { { if( creep.memory.mode === "retrieve") { - if(creep.carry.energy === 0 ) + if(creep.carry.energy < 1 ) { creep.memory.mode = "harvest"; } From 9ed12757978ccf35f469db95e14b4d7e4be33dba Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:27:57 -0500 Subject: [PATCH 069/123] actually init mode --- swampy1/role.harvester.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 752ab62..288fb83 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -27,6 +27,8 @@ let roleHarvester = { creep.memory.mode = "retrieve"; } } + else + creep.memory.mode = "harvest"; if( creep.memory.mode === "harvest" ) { From 5934fac6887be712312d51b04fbc30768785783f Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:32:21 -0500 Subject: [PATCH 070/123] run recovery in case all drones die --- swampy1/lil_army.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 7ad5937..28e3ce9 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -172,7 +172,16 @@ function one_run(spawn_name) //console.log('Clearing non-existing creep memory:', name); } } - + + if( Memory.creeps.length === 0 ) + { + let enrgy = Game.spawns[spawn_name].room.energyAvailable; + if(enrgy < 300) + enrgy = 300; + _make_creep("baby_harvester", "recovery", enrgy); + return; + } + let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; let inv = compute_inventory(); let needed = next_missing(inv, energy_to_consume); @@ -181,6 +190,7 @@ function one_run(spawn_name) } module.exports = { - one_run : one_run + one_run : one_run, + make_creep : _make_creep }; From 163e29f29b6ef32647f10068bdbda6a75a917e52 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:33:36 -0500 Subject: [PATCH 071/123] Fix: only consider my creeps --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 28e3ce9..aab7812 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -173,7 +173,7 @@ function one_run(spawn_name) } } - if( Memory.creeps.length === 0 ) + if( Game.creeps.length === 0 ) { let enrgy = Game.spawns[spawn_name].room.energyAvailable; if(enrgy < 300) From f18515a3c3d63309057945271ac07e71ac546ca7 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:34:41 -0500 Subject: [PATCH 072/123] Fix: only consider my creeps, but its a hash --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index aab7812..7d5fa60 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -173,7 +173,7 @@ function one_run(spawn_name) } } - if( Game.creeps.length === 0 ) + if( Object.keys(Game.creeps).length === 0 ) { let enrgy = Game.spawns[spawn_name].room.energyAvailable; if(enrgy < 300) From f7a7621de6202291207492d799c1e5c580ed4f27 Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:35:31 -0500 Subject: [PATCH 073/123] Fix: only consider my creeps, actual spawn name --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 7d5fa60..7d567b5 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -178,7 +178,7 @@ function one_run(spawn_name) let enrgy = Game.spawns[spawn_name].room.energyAvailable; if(enrgy < 300) enrgy = 300; - _make_creep("baby_harvester", "recovery", enrgy); + _make_creep("baby_harvester", spawn_name, enrgy); return; } From ad76ed703e8143b3a6e7940d94c49e503ca805df Mon Sep 17 00:00:00 2001 From: seer Date: Sun, 4 Dec 2016 18:40:04 -0500 Subject: [PATCH 074/123] faster recovery; make smaller drones --- swampy1/lil_army.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 7d567b5..b919cc4 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -173,16 +173,21 @@ function one_run(spawn_name) } } - if( Object.keys(Game.creeps).length === 0 ) + let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; + let energy_available = Game.spawns[spawn_name].room.energyAvailable; + let num_my_creeps = Object.keys(Game.creeps).length; + if( num_my_creeps === 0 ) { - let enrgy = Game.spawns[spawn_name].room.energyAvailable; - if(enrgy < 300) - enrgy = 300; - _make_creep("baby_harvester", spawn_name, enrgy); + if(energy_available >= 300) + _make_creep("baby_harvester", spawn_name, energy_available); return; } + else if( num_my_creeps < 6 ) + { + if(energy_available >= 300) + energy_to_consume = energy_available; + } - let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; let inv = compute_inventory(); let needed = next_missing(inv, energy_to_consume); if(needed) From 95673b3b8dc751bfc2a6e5f156c72a032a65f504 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 15:08:09 -0500 Subject: [PATCH 075/123] Refactor mining planning to encompass all harv/upgd/build activity --- swampy1/TODO.txt | 12 ++++++- swampy1/main.js | 6 ++-- swampy1/mining_planner.js | 48 ++++++++++++++++++++++++++++ swampy1/role.harvester.js | 67 ++++++++++++++++++++++++--------------- 4 files changed, 103 insertions(+), 30 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index b869903..6ee6830 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,5 +1,15 @@ -harverster: dont short hit offloads !!! + + +* Redo SCV's + Mining loops - separate all scanning from all working + choosing targets etc + Max 1 upgrader + Builders fall back to harvesting + all fallback to upgrading + creep.room.controller + parking period for x ticks?? + all gatherers add to mining plan builders idle as harvies(?) diff --git a/swampy1/main.js b/swampy1/main.js index dfc150b..a6351b9 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -7,7 +7,7 @@ var reports = require('reports'); var mining_planner = require('mining_planner'); -roleHarvester.init(mining_planner.request_mining_target); +roleHarvester.init(mining_planner); function defendRoom(roomName) { @@ -68,10 +68,10 @@ module.exports.loop = function () { roleHarvester.run(creep); } else if(creep.memory.role == 'upgrader') { - roleUpgrader.run(creep); + roleHarvester.run(creep); } else if(creep.memory.role == 'builder') { - roleBuilder.run(creep); + roleHarvester.run(creep); } else if(creep.memory.role == 'defense') { roleDefense.run(creep); diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 7a1f1d8..5d5f7f1 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -81,6 +81,25 @@ function refresh_room_mining_plan(room_name) } } //allocated harvs are all that is left now + // find energy return targets + var room = Game.rooms[room_name]; + var retrieve_targets = room.find(FIND_STRUCTURES, { + filter: (structure) => { + return (structure.structureType == STRUCTURE_EXTENSION || structure.structureType == STRUCTURE_SPAWN + || structure.structureType == STRUCTURE_TOWER ) && structure.energy < structure.energyCapacity; + } + }); + if(retrieve_targets.length) + mine_map.retrieve_to = retrieve_targets.map( a => a.id); + else + mine_map.retrieve_to = null; + + // find building targets + let build_targets = room.find(FIND_CONSTRUCTION_SITES); + if(build_targets.length) + mine_map.to_build = build_targets.map( a => a.id); + else + mine_map.to_build = null; } function _allocate_creep_to_mine(mine_map, creep) @@ -144,6 +163,33 @@ function reset_mining_plan(room_name) delete Memory.creeps[ nm ].harvest_from_src_id; } } + +function request_build_target(creep) +{ + let room_name = creep.room.name; + if(! Memory.mining_map || !Memory.mining_map[room_name]) + { + notice("Creep ${creep.name} has no mining map to be allocated to!"); + return null; + } + let mine_map = Memory.mining_map[room_name]; + if(! mine_map.to_build) + return null; + return mine_map.to_build[0]; +} +function request_retrieve_target(creep) +{ + let room_name = creep.room.name; + if(! Memory.mining_map || !Memory.mining_map[room_name]) + { + notice("Creep ${creep.name} has no mining map to be allocated to!"); + return null; + } + let mine_map = Memory.mining_map[room_name]; + if(! mine_map.retrieve_to) + return null; + return mine_map.retrieve_to[0]; +} //request mining target(room, creep) function request_mining_target(creep) { @@ -169,6 +215,8 @@ module.exports = analyze_room : analyze_room, refresh_room_mining_plan : refresh_room_mining_plan, request_mining_target: request_mining_target, + request_retrieve_target: request_retrieve_target, + request_build_target: request_build_target, reset_mining_plan : reset_mining_plan, }; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 288fb83..4005928 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -1,5 +1,9 @@ "use strict"; const util = require('util'); +const notice = util.mk_notice("mining_map"); + + +const rmap = {"builder":"build", "harvester":"retrieve"}; let roleHarvester = { @@ -10,6 +14,7 @@ let roleHarvester = { roleHarvester.alloc_func = work_allcator; }, + /** @param {Creep} creep **/ run: function(creep) { @@ -24,26 +29,24 @@ let roleHarvester = { { if(creep.carry.energy >= creep.carryCapacity) { - creep.memory.mode = "retrieve"; + creep.memory.mode = "upgrade"; + if( creep.memory.role && rmap[creep.memory.role] ) + creep.memory.mode = rmap[creep.memory.role]; } } else + { creep.memory.mode = "harvest"; + } if( creep.memory.mode === "harvest" ) { if(creep.memory.harvest_from_src_id == null ) { - if( roleHarvester.alloc_func ) - { - creep.memory.harvest_from_src_id = roleHarvester.alloc_func(creep); - } + creep.memory.harvest_from_src_id = roleHarvester.work_api.request_mining_target(creep); if(creep.memory.harvest_from_src_id == null ) - { - var sources = creep.room.find(FIND_SOURCES_ACTIVE); - creep.memory.harvest_from_src_id = sources[util.getRandomInt(0, sources.length)].id; - } + return; } let source = Game.getObjectById(creep.memory.harvest_from_src_id); @@ -53,28 +56,40 @@ let roleHarvester = { creep.moveTo(source); } } - else + else if( creep.memory.mode === "build" ) + { + let build_target = roleHarvester.work_api.request_build_target(creep); + build_target = Game.getObjectById(build_target); + if(build_target) + { + util.set_doing_state(creep, "build"); + if(creep.transfer(build_target, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) + creep.moveTo(build_target); + } + else + { + creep.memory.mode = "retrieve"; + } + } + else if( creep.memory.mode === "upgrade" ) { - var targets = creep.room.find(FIND_STRUCTURES, { - filter: (structure) => { - return (structure.structureType == STRUCTURE_EXTENSION - || structure.structureType == STRUCTURE_SPAWN - || structure.structureType == STRUCTURE_TOWER ) && - structure.energy < structure.energyCapacity; - } - }); - if(targets.length > 0) { + if(creep.upgradeController(creep.room.controller) === ERR_NOT_IN_RANGE) { + creep.moveTo(creep.room.controller); + } + } + else if( creep.memory.mode === "retrieve" ) + { + let retrieve_target = roleHarvester.work_api.request_retrieve_target(creep); + retrieve_target = Game.getObjectById(retrieve_target); + if(retrieve_target) + { util.set_doing_state(creep, "retrieve"); - if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { - creep.moveTo(targets[0]); - } + if(creep.transfer(retrieve_target, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) + creep.moveTo(retrieve_target); } else { - util.set_doing_state(creep, "park"); - targets = creep.room.find(FIND_STRUCTURES, { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); - if(targets.length > 0) - creep.moveTo(targets[0]); + creep.memory.mode = "upgrade"; } } } From 49cc2cb706aaa8b85336ee17b19db186a45af6cb Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 15:37:12 -0500 Subject: [PATCH 076/123] Cleanup unused stuff --- swampy1/main.js | 2 -- swampy1/role.builder.js | 51 ---------------------------------------- swampy1/role.upgrader.js | 33 -------------------------- 3 files changed, 86 deletions(-) delete mode 100644 swampy1/role.builder.js delete mode 100644 swampy1/role.upgrader.js diff --git a/swampy1/main.js b/swampy1/main.js index a6351b9..3a8151a 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -1,6 +1,4 @@ var roleHarvester = require('role.harvester'); -var roleUpgrader = require('role.upgrader'); -var roleBuilder = require('role.builder'); var roleDefense = require('role.defense'); var lil_army = require('lil_army'); var reports = require('reports'); diff --git a/swampy1/role.builder.js b/swampy1/role.builder.js deleted file mode 100644 index 82798d6..0000000 --- a/swampy1/role.builder.js +++ /dev/null @@ -1,51 +0,0 @@ -"use strict"; -const util = require('util'); - - -var roleBuilder = { - - /** @param {Creep} creep **/ - run: function(creep) { - - if(creep.memory.building && creep.carry.energy === 0) { - creep.memory.building = false; - } - else if(!creep.memory.building && creep.carry.energy === creep.carryCapacity) { - creep.memory.building = true; - } - - if(creep.memory.building) - { - var targets = creep.room.find(FIND_CONSTRUCTION_SITES); - if(targets.length) - { - util.set_doing_state(creep, "building"); - if(creep.build(targets[0]) === ERR_NOT_IN_RANGE) - { - creep.moveTo(targets[0]); - } - } - else - { - util.set_doing_state(creep, "park"); - targets = creep.room.find(FIND_STRUCTURES, - { filter: (structure) => { return (structure.structureType == STRUCTURE_SPAWN ); } }); - if(targets.length > 0) - { - let dest_pos = targets[0].pos; - creep.moveTo(dest_pos.x, dest_pos.y - 3); - } - } - } - else - { - util.set_doing_state(creep, "harvesting"); - var sources = creep.room.find(FIND_SOURCES); - if(creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) { - creep.moveTo(sources[0]); - } - } - } -}; - -module.exports = roleBuilder; diff --git a/swampy1/role.upgrader.js b/swampy1/role.upgrader.js deleted file mode 100644 index 7ea1124..0000000 --- a/swampy1/role.upgrader.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -const util = require('util'); - -var roleUpgrader = { - - /** @param {Creep} creep **/ - run: function(creep) { - - if(creep.memory.upgrading && creep.carry.energy === 0) { - creep.memory.upgrading = false; - util.set_doing_state(creep, "harvesting"); - } - if(!creep.memory.upgrading && creep.carry.energy === creep.carryCapacity) { - creep.memory.upgrading = true; - util.set_doing_state(creep, "upgrading"); - } - - if(creep.memory.upgrading) { - if(creep.upgradeController(creep.room.controller) === ERR_NOT_IN_RANGE) { - creep.moveTo(creep.room.controller); - } - } - else { - var sources = creep.room.find(FIND_SOURCES); - if(creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) { - creep.moveTo(sources[0]); - } - } - } -}; - -module.exports = roleUpgrader; - From 88c46c62ad289ca248c3d983afb0db72915fc47c Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 15:41:11 -0500 Subject: [PATCH 077/123] Bugfix: not linking interface --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 4005928..134db77 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -11,7 +11,7 @@ let roleHarvester = { init : function( work_allcator ) { - roleHarvester.alloc_func = work_allcator; + roleHarvester.work_api = work_allcator; }, From 35173119fe933e604a152bb45537fd16f5670a6a Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 15:49:28 -0500 Subject: [PATCH 078/123] Actually finish task before continuing --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 134db77..44db8fb 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -18,7 +18,7 @@ let roleHarvester = { /** @param {Creep} creep **/ run: function(creep) { - if( creep.memory.mode === "retrieve") + if( creep.memory.mode === "retrieve" || creep.memory.mode === "build" || creep.memory.mode === "upgrade" ) { if(creep.carry.energy < 1 ) { From e46b3b839652dc7783e1d7b33149fecbef7db349 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 17:05:52 -0500 Subject: [PATCH 079/123] cap army size until energy class reached --- swampy1/lil_army.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index b919cc4..7c279cf 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -15,9 +15,8 @@ let _army_composition = {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 6}, {"model":"baby_builder", "count": 3}, - {"model":"baby_upgrader", "count" : 2}, {"model":"baby_upgrader", "count" : 3}, - {"model":"baby_harvester", "count" : 20}, + {"model":"baby_harvester", "count" : 20, "min_energy_class":500}, {"model":"killbot", "count" : 9}, ]; @@ -88,13 +87,6 @@ function _make_creep(model, spawn_name, energy_to_consume) let getpart = at_ndx => modl.body[at_ndx]; let part = getpart(at_ndx); let energy_used = 0; - - if( Memory.max_energy != energy_to_consume) - { - Memory.max_energy = energy_to_consume; - console.log(`Energy Class updated to ${Memory.max_energy}`); - } - if( modl.build != null ) { body_spec = modl.build(energy_to_consume); @@ -135,6 +127,8 @@ function next_missing(inventory, energy) for(let x=0; x<_army_composition.length; ++x ) { let spec = _army_composition[x]; + if( !Memory.max_energy || (spec.min_energy_class && spec.min_energy_class > Memory.max_energy) ) + break; let cur_count = inventory[spec.model]; let min_energy_needed = models[ spec.model ].min_energy; if( cur_count < spec.count && @@ -176,6 +170,13 @@ function one_run(spawn_name) let energy_to_consume = Game.spawns[spawn_name].room.energyCapacityAvailable; let energy_available = Game.spawns[spawn_name].room.energyAvailable; let num_my_creeps = Object.keys(Game.creeps).length; + + if( Memory.max_energy != energy_to_consume) + { + Memory.max_energy = energy_to_consume; + console.log(`Energy Class updated to ${Memory.max_energy}`); + } + if( num_my_creeps === 0 ) { if(energy_available >= 300) From d4f887106b0bc76ec2dac2a401c14ffb5f4525f7 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 17:08:10 -0500 Subject: [PATCH 080/123] try to optimize build for the fact that we dont avoid danger --- swampy1/lil_army.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 7c279cf..1fc8d0d 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -12,11 +12,11 @@ let _army_composition = [ {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, - {"model":"baby_upgrader", "count" : 1}, - {"model":"baby_harvester", "count" : 6}, - {"model":"baby_builder", "count": 3}, + {"model":"baby_upgrader", "count" : 2}, + {"model":"baby_harvester", "count" : 3}, + {"model":"baby_builder", "count": 3, "min_energy_class":550}, {"model":"baby_upgrader", "count" : 3}, - {"model":"baby_harvester", "count" : 20, "min_energy_class":500}, + {"model":"baby_harvester", "count" : 20, "min_energy_class":550}, {"model":"killbot", "count" : 9}, ]; From 7372558e36c909575e6748a1d63d4715175fd397 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 17:21:17 -0500 Subject: [PATCH 081/123] bugfix: building was broken due to calling transfer --- swampy1/role.harvester.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 44db8fb..ba3235f 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -63,8 +63,14 @@ let roleHarvester = { if(build_target) { util.set_doing_state(creep, "build"); - if(creep.transfer(build_target, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) + let res = creep.build(build_target, RESOURCE_ENERGY); + if(res == ERR_NOT_IN_RANGE) + { creep.moveTo(build_target); + }else if (res === OK) + { + }else + notice(`creep ${creep.name} failed to build: ${res}`); } else { From b080fec2b57c948ee9638ba3a8af858ef4b11659 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 6 Dec 2016 17:51:42 -0500 Subject: [PATCH 082/123] refine bots --- swampy1/lil_army.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 1fc8d0d..1ba6ad1 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -13,7 +13,7 @@ let _army_composition = {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 2}, - {"model":"baby_harvester", "count" : 3}, + {"model":"baby_harvester", "count" : 5}, {"model":"baby_builder", "count": 3, "min_energy_class":550}, {"model":"baby_upgrader", "count" : 3}, {"model":"baby_harvester", "count" : 20, "min_energy_class":550}, @@ -23,17 +23,17 @@ let _army_composition = let models = { "baby_builder" : { - "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], + "body" : [MOVE,WORK,CARRY], "role" : "builder", "prefix" : "bbldr_" }, "baby_harvester" : { - "body" : [MOVE,MOVE,WORK,CARRY,CARRY,CARRY], + "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], "role" : "harvester", "prefix" : "bharv_" }, "baby_upgrader" : { - "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], + "body" : [MOVE,WORK,CARRY], "role" : "upgrader", "prefix" : "bupgd_" }, From b708b215a26f2459b7c548571b6b5a5048b45f07 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 09:38:24 -0500 Subject: [PATCH 083/123] improve logic for fallback harvester work --- swampy1/TODO.txt | 18 ++++-------------- swampy1/lil_army.js | 4 +--- swampy1/role.harvester.js | 12 ++++++++++-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 6ee6830..a51e4c8 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,18 +1,8 @@ -* Redo SCV's - Mining loops - separate all scanning from all working - choosing targets etc - Max 1 upgrader - Builders fall back to harvesting - all fallback to upgrading - creep.room.controller - parking period for x ticks?? +dead end traffic jam: + limit # of harvies assigned by accessible spaces? + 1-2-3 + look at all squares around sources and limit them accordingly - -all gatherers add to mining plan -builders idle as harvies(?) - more efficient building plan? terrible loop as of now - -killbot x 1 ? diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 1ba6ad1..52b2c1a 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -12,10 +12,8 @@ let _army_composition = [ {"model":"baby_harvester", "count" : 2}, {"model":"baby_builder", "count": 1}, - {"model":"baby_upgrader", "count" : 2}, + {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 5}, - {"model":"baby_builder", "count": 3, "min_energy_class":550}, - {"model":"baby_upgrader", "count" : 3}, {"model":"baby_harvester", "count" : 20, "min_energy_class":550}, {"model":"killbot", "count" : 9}, ]; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index ba3235f..c7b7071 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -74,7 +74,11 @@ let roleHarvester = { } else { - creep.memory.mode = "retrieve"; + //No building to work on, fall back to next work + if( creep.memory.role === 'harvester' ) + creep.memory.mode = "upgrade"; + else + creep.memory.mode = "retrieve"; } } else if( creep.memory.mode === "upgrade" ) @@ -95,7 +99,11 @@ let roleHarvester = { } else { - creep.memory.mode = "upgrade"; + //No place to drop energy, fall back to next work + if( creep.memory.role === 'harvester' ) + creep.memory.mode = "build"; + else + creep.memory.mode = "upgrade"; } } } From 71994bb8b8a9a6542563885aa0ff95258aeff996 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 09:54:28 -0500 Subject: [PATCH 084/123] Limit harvesters by accessibility of node --- swampy1/mining_planner.js | 28 ++++++++++++++++++++++++++++ swampy1/mining_planner.js: | 0 2 files changed, 28 insertions(+) create mode 100644 swampy1/mining_planner.js: diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 5d5f7f1..deeb6f2 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -20,6 +20,29 @@ function analyze_room(room_name) // measure distance to spawn, capacity let source = sources[ndx]; source.dis_to_spawn = util.qPosDist(spawn.pos, source.pos); + + source.is_not_wall_count = 0; + let vectors = [[-1,-1],[-1,0],[0,-1],[1,1],[1,0],[0,1],[1,-1],[-1,1]]; + for(let vec_ndx in vectors) + { + let vector = vectors[vec_ndx]; + let x = source.pos.x + vector[0]; + let y = source.pos.y + vector[1]; + let terrain = room.lookAtArea(3,35,3,35,true); + let is_wall = false; + for( let ter_ndx in terrain) + { + let terrain_entry = terrain[ter_ndx]; + if(terrain_entry && terrain_entry.terrain === "wall") + { + is_wall = true; + break; + } + } + if( is_wall ) + source.is_not_wall_count += 1; + + } } //sort nearest to furthest sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); @@ -30,6 +53,11 @@ function analyze_room(room_name) { let source = sources[ndx]; source.required_harvesters = 3; + if(source.is_not_wall_count < 3) + { + source.required_harvesters = source.is_not_wall_count + 1; + } + notice(`Source ${source.id} source.is_not_wall_count=${source.required_harvesters} not_wall_count= ${source.is_not_wall_count}`); } let src_map = {}; sources.map( src => src_map[src.id] = src ); diff --git a/swampy1/mining_planner.js: b/swampy1/mining_planner.js: new file mode 100644 index 0000000..e69de29 From 52a02e29f6bed9ef77b1a2810a243e34cd29c3ac Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 09:57:53 -0500 Subject: [PATCH 085/123] bug in room analysis --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index deeb6f2..54bc886 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -46,7 +46,7 @@ function analyze_room(room_name) } //sort nearest to furthest sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); - sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}}) ); + sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}, "is_not_wall_count":src.is_not_wall_count }) ); sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dist}`)); // plan how many miners per node (more per distance? Path? Road? Etc. start with roundly robins) for( let ndx in sources) From 37115281e239d34fa4a086e08379f894d688bbb3 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 10:53:18 -0500 Subject: [PATCH 086/123] debug --- swampy1/mining_planner.js | 1 + 1 file changed, 1 insertion(+) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 54bc886..da04196 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -39,6 +39,7 @@ function analyze_room(room_name) break; } } +notice(`X:${x} Y:${y} ${is_wall?"IS WALL":"IS NOT WALL"}`); if( is_wall ) source.is_not_wall_count += 1; From f7ee1bf600dd8b8fddb7e7436d12908ef914a301 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 11:04:34 -0500 Subject: [PATCH 087/123] actually use the computed vectors --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index da04196..459d41e 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -28,7 +28,7 @@ function analyze_room(room_name) let vector = vectors[vec_ndx]; let x = source.pos.x + vector[0]; let y = source.pos.y + vector[1]; - let terrain = room.lookAtArea(3,35,3,35,true); + let terrain = room.lookAtArea(y,x,y,x,true); let is_wall = false; for( let ter_ndx in terrain) { From 5a2ce8879d3e50e64633750bb68a96f68c986dea Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 11:06:13 -0500 Subject: [PATCH 088/123] bugfix wall counting --- swampy1/mining_planner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 459d41e..1f4ebf8 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -40,7 +40,7 @@ function analyze_room(room_name) } } notice(`X:${x} Y:${y} ${is_wall?"IS WALL":"IS NOT WALL"}`); - if( is_wall ) + if( ! is_wall ) source.is_not_wall_count += 1; } From 30deea105fa270a3f5b5499cfacc66bdd5dbc2a2 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 11:07:24 -0500 Subject: [PATCH 089/123] remove old debug --- swampy1/mining_planner.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 1f4ebf8..33dfd33 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -39,7 +39,7 @@ function analyze_room(room_name) break; } } -notice(`X:${x} Y:${y} ${is_wall?"IS WALL":"IS NOT WALL"}`); + //notice(`X:${x} Y:${y} ${is_wall?"IS WALL":"IS NOT WALL"}`); if( ! is_wall ) source.is_not_wall_count += 1; @@ -58,7 +58,7 @@ notice(`X:${x} Y:${y} ${is_wall?"IS WALL":"IS NOT WALL"}`); { source.required_harvesters = source.is_not_wall_count + 1; } - notice(`Source ${source.id} source.is_not_wall_count=${source.required_harvesters} not_wall_count= ${source.is_not_wall_count}`); + notice(`Source ${source.id} required_harvesters=${source.required_harvesters} not_wall_count= ${source.is_not_wall_count}`); } let src_map = {}; sources.map( src => src_map[src.id] = src ); From ae79ec191c9c1285a403491aefc03664c27eeab2 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 13:09:32 -0500 Subject: [PATCH 090/123] Refresh mining plan more frequently; wasting too much harv time --- swampy1/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/main.js b/swampy1/main.js index 3a8151a..629035e 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -58,6 +58,7 @@ module.exports.loop = function () { } + mining_planner.refresh_room_mining_plan(cur_room_name); for(var name in Game.creeps) { var creep = Game.creeps[name]; if(creep.spawning) @@ -78,7 +79,6 @@ module.exports.loop = function () { if((Game.time % 25) === 0) { - mining_planner.refresh_room_mining_plan(cur_room_name); reports.report_creep_makes(); } From 3de4fb0d7b79ebd0baabf6af979015a233af90bf Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 7 Dec 2016 14:13:45 -0500 Subject: [PATCH 091/123] Memory setting for max cap doesnt seem to be working --- swampy1/lil_army.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 52b2c1a..3307674 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -169,7 +169,7 @@ function one_run(spawn_name) let energy_available = Game.spawns[spawn_name].room.energyAvailable; let num_my_creeps = Object.keys(Game.creeps).length; - if( Memory.max_energy != energy_to_consume) + if( Memory.max_energy !== energy_to_consume) { Memory.max_energy = energy_to_consume; console.log(`Energy Class updated to ${Memory.max_energy}`); From fde29c82c125cba6095e0c572a4be0c39cf18fb9 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 8 Dec 2016 11:03:28 -0500 Subject: [PATCH 092/123] reoptimize harvester build order considering 25 distance plains not roads --- swampy1/TODO.txt | 22 ++++++++++++++++++---- swampy1/lil_army.js | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index a51e4c8..f401919 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,8 +1,22 @@ +Improve army composition: + only make as many as reasonable? tweak hack + power on way to room controller level 3 + make more upgraders when room level is less than 3 + + Dont make attack bots until have tower? -dead end traffic jam: - limit # of harvies assigned by accessible spaces? - 1-2-3 - look at all squares around sources and limit them accordingly + Fuel tower earlier in cycle: + first? yes + + optimize mining: + for harvesting actions might not have the best mix + extra low work factor might be a disadvantage + 2 harvest per tick might outweigh the travel costs? + Travel RTT = distance * 2 + Work delay = Capacity / 2 + @550 w/ carry = 250 + 125 ticks to fill tank + dist = 25 = 50 ticks to RTT diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 3307674..d602179 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -26,7 +26,7 @@ let models = "prefix" : "bbldr_" }, "baby_harvester" : { - "body" : [MOVE,WORK,CARRY,MOVE,CARRY,MOVE,CARRY,MOVE,CARRY,CARRY,CARRY], + "body" : [MOVE,WORK,CARRY,CARRY,CARRY,MOVE,WORK,CARRY,MOVE,CARRY,CARRY,CARRY], "role" : "harvester", "prefix" : "bharv_" }, From 314eb5da7488dc295ef6f956b2f276a29bdbe7e7 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 8 Dec 2016 11:25:47 -0500 Subject: [PATCH 093/123] prioritize tower uber alles --- swampy1/mining_planner.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 33dfd33..83c25b0 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -119,10 +119,25 @@ function refresh_room_mining_plan(room_name) } }); if(retrieve_targets.length) + { + retrieve_targets = retrieve_targets.sort( function(a,b) + { + if( a.structureType != b.structureType ) + { + if( a.structureType === STRUCTURE_TOWER ) + return -1; + else if( b.structureType === STRUCTURE_TOWER ) + return 1; + } + return a.id - b.id; + }); + mine_map.retrieve_to = retrieve_targets.map( a => a.id); + } else + { mine_map.retrieve_to = null; - + } // find building targets let build_targets = room.find(FIND_CONSTRUCTION_SITES); if(build_targets.length) From eadb639c39a62a298be79ffac0e02bf89b0c8826 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 8 Dec 2016 13:18:58 -0500 Subject: [PATCH 094/123] oversubscribe if needed --- swampy1/mining_planner.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 83c25b0..1c8cbc9 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -152,19 +152,28 @@ function _allocate_creep_to_mine(mine_map, creep) //search through sources for which one has not enough harvies //let most_needed = null; let go_to_source = null; + let need_most = null; + let need_most_source = null; for(let source_id in mine_map.sources) { let source = mine_map.sources[source_id]; let num_needed = source.required_harvesters - Object.keys(source.harvs).length; + if( !need_most || num_needed > need_most) + { + need_most = num_needed; + need_most_source = source; + } if( num_needed > 0) { go_to_source = source; break; } } + if(!go_to_source) + go_to_source = need_most_source; if(!go_to_source) { - notice("Creep ${creep.name} has no source to be allocated to!"); + notice(`Creep ${creep.name} has no source to be allocated to!`); return null; } else @@ -213,7 +222,7 @@ function request_build_target(creep) let room_name = creep.room.name; if(! Memory.mining_map || !Memory.mining_map[room_name]) { - notice("Creep ${creep.name} has no mining map to be allocated to!"); + notice(`Creep ${creep.name} has no mining map to be allocated to!`); return null; } let mine_map = Memory.mining_map[room_name]; @@ -226,7 +235,7 @@ function request_retrieve_target(creep) let room_name = creep.room.name; if(! Memory.mining_map || !Memory.mining_map[room_name]) { - notice("Creep ${creep.name} has no mining map to be allocated to!"); + notice(`Creep ${creep.name} has no mining map to be allocated to!`); return null; } let mine_map = Memory.mining_map[room_name]; @@ -240,7 +249,7 @@ function request_mining_target(creep) let room_name = creep.room.name; if(! Memory.mining_map || !Memory.mining_map[room_name]) { - notice("Creep ${creep.name} has no mining map to be allocated to!"); + notice(`Creep ${creep.name} has no mining map to be allocated to!`); return null; } let mine_map = Memory.mining_map[room_name]; From bb7e51ad64589efcbbc001d6de1d0e37ee64f18f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 8 Dec 2016 15:53:41 -0500 Subject: [PATCH 095/123] renew key drones when up to date --- swampy1/.jshintrc | 2 ++ swampy1/TODO.txt | 11 +---------- swampy1/lil_army.js | 2 +- swampy1/mining_planner.js | 14 +++++++++++++- swampy1/role.harvester.js | 23 +++++++++++++++++++++-- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index 562f741..b4f30b5 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -5,6 +5,8 @@ "eqnull" : true, "globals" : { "ERR_NOT_IN_RANGE" : false, + "ERR_NOT_ENOUGH_ENERGY" : false, + "ERR_FULL" : false, "OK" : false, "FIND_SOURCES" : false, diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index f401919..4b3dfdb 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,4 +1,5 @@ +bot refresh Improve army composition: only make as many as reasonable? tweak hack @@ -10,13 +11,3 @@ Improve army composition: Fuel tower earlier in cycle: first? yes - optimize mining: - for harvesting actions might not have the best mix - extra low work factor might be a disadvantage - 2 harvest per tick might outweigh the travel costs? - Travel RTT = distance * 2 - Work delay = Capacity / 2 - @550 w/ carry = 250 - 125 ticks to fill tank - dist = 25 = 50 ticks to RTT - diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index d602179..28f0660 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -112,7 +112,7 @@ function _make_creep(model, spawn_name, energy_to_consume) let newname = modl.prefix + util.getRandomName(); notice("Making a \"" + model + "\" " + newname + ` (${energy_used})`); //notice(" spec = " + body_spec.join(",")); - let ret = Game.spawns[spawn_name].createCreep(body_spec, newname, {role:modl.role, model:model}); + let ret = Game.spawns[spawn_name].createCreep(body_spec, newname, {role:modl.role, model:model, cost:energy_used}); if(ret < 0) { notice("Failed to make a \"" + model + "\" " + newname + " "+ ret + ` (${energy_used})`); diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 1c8cbc9..53e83bc 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -63,6 +63,7 @@ function analyze_room(room_name) let src_map = {}; sources.map( src => src_map[src.id] = src ); Memory.mining_map[room_name].sources = src_map; + Memory.mining_map[room_name].spawnid = spawn.id; return; } @@ -216,7 +217,17 @@ function reset_mining_plan(room_name) delete Memory.creeps[ nm ].harvest_from_src_id; } } - +function get_spawn_id(creep) +{ + let room_name = creep.room.name; + if(! Memory.mining_map || !Memory.mining_map[room_name]) + { + notice(`Creep ${creep.name} has no mining map to be allocated to!`); + return null; + } + let mine_map = Memory.mining_map[room_name]; + return mine_map.spawnid; +} function request_build_target(creep) { let room_name = creep.room.name; @@ -271,5 +282,6 @@ module.exports = request_retrieve_target: request_retrieve_target, request_build_target: request_build_target, reset_mining_plan : reset_mining_plan, + get_spawn_id : get_spawn_id, }; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index c7b7071..730867c 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -3,7 +3,7 @@ const util = require('util'); const notice = util.mk_notice("mining_map"); -const rmap = {"builder":"build", "harvester":"retrieve"}; +const rmap = {"builder":"build", "harvester":"retrieve", "upgrader":"upgrade"}; let roleHarvester = { @@ -81,6 +81,21 @@ let roleHarvester = { creep.memory.mode = "retrieve"; } } + else if ( creep.memory.mode === "renew" ) + { + let spawnid = roleHarvester.work_api.get_spawn_id(); + let spawn = Game.getObjectById(spawnid); + let retv = spawn.renewCreep(creep); + if(retv === ERR_NOT_ENOUGH_ENERGY || retv === ERR_FULL) + { + //finished repairs + creep.memory.mode = rmap[creep.memory.role]; + } + else if( retv == ERR_NOT_IN_RANGE ) + { + creep.moveTo(spawn); + } + } else if( creep.memory.mode === "upgrade" ) { if(creep.upgradeController(creep.room.controller) === ERR_NOT_IN_RANGE) { @@ -99,8 +114,12 @@ let roleHarvester = { } else { + if(creep.ticksToLive < 128 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) + { + creep.memory.mode = "renew"; + } //No place to drop energy, fall back to next work - if( creep.memory.role === 'harvester' ) + else if( creep.memory.role === 'harvester' ) creep.memory.mode = "build"; else creep.memory.mode = "upgrade"; From 4d6d131980997ad1e226100a810cd6d91951874f Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 8 Dec 2016 15:54:22 -0500 Subject: [PATCH 096/123] wtf why is this file here --- swampy1/mining_planner.js: | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 swampy1/mining_planner.js: diff --git a/swampy1/mining_planner.js: b/swampy1/mining_planner.js: deleted file mode 100644 index e69de29..0000000 From 35d8f338df40abfae02a2b4152dc7d1aa29d37ba Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 14:41:58 -0500 Subject: [PATCH 097/123] more lead time to recover --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 730867c..b23a484 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -114,7 +114,7 @@ let roleHarvester = { } else { - if(creep.ticksToLive < 128 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) + if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) { creep.memory.mode = "renew"; } From e3aa97f7a6194b2eb159b34bed4ac30dc1a8ed65 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 14:48:07 -0500 Subject: [PATCH 098/123] more chances to renew --- swampy1/role.harvester.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index b23a484..0f037b7 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -22,7 +22,12 @@ let roleHarvester = { { if(creep.carry.energy < 1 ) { - creep.memory.mode = "harvest"; + if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) + { + creep.memory.mode = "renew"; + } + else + creep.memory.mode = "harvest"; } } else if( creep.memory.mode === "harvest" ) From 8edf770d2d0d2de1b5b4d245b6d5fa6bd40534ff Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 14:58:02 -0500 Subject: [PATCH 099/123] debug renew logic --- swampy1/role.harvester.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 0f037b7..fba80f9 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -22,6 +22,8 @@ let roleHarvester = { { if(creep.carry.energy < 1 ) { +if(creep.ticksToLive < 312) + notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.energy_used} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) { creep.memory.mode = "renew"; @@ -119,6 +121,8 @@ let roleHarvester = { } else { +if(creep.ticksToLive < 312) + notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.energy_used} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) { creep.memory.mode = "renew"; From 6d97662fcf9ded1e3aa3e57b40371a73050e7795 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:00:50 -0500 Subject: [PATCH 100/123] Renew: use proper cost varible --- swampy1/role.harvester.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index fba80f9..0b51a79 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -23,8 +23,8 @@ let roleHarvester = { if(creep.carry.energy < 1 ) { if(creep.ticksToLive < 312) - notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.energy_used} costpenalty`); - if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) + notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); + if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; } @@ -122,8 +122,8 @@ if(creep.ticksToLive < 312) else { if(creep.ticksToLive < 312) - notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.energy_used} costpenalty`); - if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.energy_used) <= 50 ) + notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); + if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; } From a36fb8603979a300a024adfed9d236064b7a6fba Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:07:18 -0500 Subject: [PATCH 101/123] More debug of renew needed, not happening at all --- swampy1/role.harvester.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 0b51a79..a36d548 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -18,12 +18,16 @@ let roleHarvester = { /** @param {Creep} creep **/ run: function(creep) { - if( creep.memory.mode === "retrieve" || creep.memory.mode === "build" || creep.memory.mode === "upgrade" ) + if(creep.ticksToLive < 100 && (Memory.max_energy - creep.memory.cost) <= 50 ) + { + creep.memory.mode = "renew"; + } + else if( creep.memory.mode === "retrieve" || creep.memory.mode === "build" || creep.memory.mode === "upgrade" ) { if(creep.carry.energy < 1 ) { if(creep.ticksToLive < 312) - notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); +notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; @@ -90,10 +94,15 @@ if(creep.ticksToLive < 312) } else if ( creep.memory.mode === "renew" ) { + util.set_doing_state(creep, "renew"); let spawnid = roleHarvester.work_api.get_spawn_id(); let spawn = Game.getObjectById(spawnid); let retv = spawn.renewCreep(creep); - if(retv === ERR_NOT_ENOUGH_ENERGY || retv === ERR_FULL) + if(retv == OK) + { +notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); + } + else if(retv === ERR_NOT_ENOUGH_ENERGY || retv === ERR_FULL) { //finished repairs creep.memory.mode = rmap[creep.memory.role]; @@ -122,7 +131,7 @@ if(creep.ticksToLive < 312) else { if(creep.ticksToLive < 312) - notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); +notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; From 9e2cc6543a1346898639cde9c9617ce432d4f9a1 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:10:27 -0500 Subject: [PATCH 102/123] at least try to work - pass creep to function --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index a36d548..e3f72f5 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -95,7 +95,7 @@ notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memo else if ( creep.memory.mode === "renew" ) { util.set_doing_state(creep, "renew"); - let spawnid = roleHarvester.work_api.get_spawn_id(); + let spawnid = roleHarvester.work_api.get_spawn_id(creep); let spawn = Game.getObjectById(spawnid); let retv = spawn.renewCreep(creep); if(retv == OK) From 8804b5812731c67b72bb93902a6b8876f40de3df Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:18:11 -0500 Subject: [PATCH 103/123] Dont stop renewal short of max --- swampy1/role.harvester.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index e3f72f5..fe5ba72 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -102,7 +102,13 @@ notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memo { notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); } - else if(retv === ERR_NOT_ENOUGH_ENERGY || retv === ERR_FULL) + else if(retv === ERR_NOT_ENOUGH_ENERGY) + { + //give energy to spawn if have any + creep.transfer(spawn, RESOURCE_ENERGY); + //otherwise idle + } + else if( retv === ERR_FULL) { //finished repairs creep.memory.mode = rmap[creep.memory.role]; From f086380959b67d005207f0cbbe8e44e89fc434d5 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:20:45 -0500 Subject: [PATCH 104/123] debug why renew stops short --- swampy1/role.harvester.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index fe5ba72..68f8ed5 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -107,10 +107,12 @@ notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); //give energy to spawn if have any creep.transfer(spawn, RESOURCE_ENERGY); //otherwise idle +notice(`Creep ${creep.name} needs to wait to get recharged`); } else if( retv === ERR_FULL) { //finished repairs +notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); creep.memory.mode = rmap[creep.memory.role]; } else if( retv == ERR_NOT_IN_RANGE ) From d822b13725d9832af2f4ac49c2feee626250bdd1 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:24:54 -0500 Subject: [PATCH 105/123] dont destory renew mode on next loop iteration --- swampy1/role.harvester.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 68f8ed5..3491d2b 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -45,7 +45,7 @@ notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memo creep.memory.mode = rmap[creep.memory.role]; } } - else + else if(!creep.memory.mode) { creep.memory.mode = "harvest"; } From f93874f68fb85b5c49c2c0ac76b75b83eb1fcb9a Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Fri, 9 Dec 2016 15:29:04 -0500 Subject: [PATCH 106/123] phase out debug as renew has started to work a bit --- swampy1/role.harvester.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 3491d2b..c5de70e 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -26,8 +26,7 @@ let roleHarvester = { { if(creep.carry.energy < 1 ) { -if(creep.ticksToLive < 312) -notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); + //notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; @@ -100,14 +99,14 @@ notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memo let retv = spawn.renewCreep(creep); if(retv == OK) { -notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); + //notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); } else if(retv === ERR_NOT_ENOUGH_ENERGY) { //give energy to spawn if have any creep.transfer(spawn, RESOURCE_ENERGY); //otherwise idle -notice(`Creep ${creep.name} needs to wait to get recharged`); + //notice(`Creep ${creep.name} needs to wait to get recharged`); } else if( retv === ERR_FULL) { @@ -138,8 +137,7 @@ notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); } else { -if(creep.ticksToLive < 312) -notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); + //notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { creep.memory.mode = "renew"; From 584076941c1432d1708f78f2fc0fd32da12d0cbf Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 10:46:24 -0500 Subject: [PATCH 107/123] use tower to heal injured creeps --- swampy1/TODO.txt | 11 +---------- swampy1/main.js | 7 +++++++ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 4b3dfdb..6f8e4b2 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,13 +1,4 @@ -bot refresh -Improve army composition: - only make as many as reasonable? tweak hack - power on way to room controller level 3 - make more upgraders when room level is less than 3 - - Dont make attack bots until have tower? - - Fuel tower earlier in cycle: - first? yes +USE TOWER AS A HEALER diff --git a/swampy1/main.js b/swampy1/main.js index 629035e..10c3386 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -51,6 +51,13 @@ module.exports.loop = function () { if(closestHostile) { tower.attack(closestHostile); } + else + { + var injured_creeps = room.find( FIND_MY_CREEPS, {filter: (creep)=> creep.hits 0) + tower.heal(injured_creeps[0]); + } } else { From 9cdbb63d4f77e83151b7c6909f606f23773addd7 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 11:54:43 -0500 Subject: [PATCH 108/123] fix for api use for find nearest --- swampy1/main.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index 10c3386..d2f84b2 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -53,10 +53,10 @@ module.exports.loop = function () { } else { - var injured_creeps = room.find( FIND_MY_CREEPS, {filter: (creep)=> creep.hits crp.hits 0) - tower.heal(injured_creeps[0]); + if(injured_creep) + tower.heal(injured_creep); } } else From 6d9017c9fb2b8241698f4297bf301d69a2ac130e Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 12:20:34 -0500 Subject: [PATCH 109/123] deprioritize structure repairs --- swampy1/main.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/swampy1/main.js b/swampy1/main.js index d2f84b2..9537eea 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -40,13 +40,6 @@ module.exports.loop = function () { var tower = cur_room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_TOWER}})[0]; if(tower) { - var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { - filter: (structure) => structure.hits < structure.hitsMax - }); - if(closestDamagedStructure) { - tower.repair(closestDamagedStructure); - } - var closestHostile = tower.pos.findClosestByRange(FIND_HOSTILE_CREEPS); if(closestHostile) { tower.attack(closestHostile); @@ -57,6 +50,16 @@ module.exports.loop = function () { if(injured_creep) tower.heal(injured_creep); + else + { + var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { + filter: (structure) => structure.hits < structure.hitsMax + }); + if(closestDamagedStructure) { + tower.repair(closestDamagedStructure); + } + + } } } else From a7ff85a8835794068ecc689db7eced6dda888b9e Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 12:49:46 -0500 Subject: [PATCH 110/123] change sizes --- swampy1/lil_army.js | 2 +- swampy1/role.defense.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 28f0660..485c02b 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -14,7 +14,7 @@ let _army_composition = {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 5}, - {"model":"baby_harvester", "count" : 20, "min_energy_class":550}, + {"model":"baby_harvester", "count" : 12, "min_energy_class":550}, {"model":"killbot", "count" : 9}, ]; diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index d3f95be..dc7524e 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -11,7 +11,7 @@ function _form_new_squad(room_name) let new_squad = { "name" : "squad_" + util.getRandomName(), "room_name" : room_name, - "members_needed" : 8, + "members_needed" : 3, "members" : {}, "target" : null, "mode" : "form", // "form", "fight", "rally" From fd587923dfba757026192b30e4fb40c5f9fa0d09 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 14:14:52 -0500 Subject: [PATCH 111/123] towers wont repair buildings but creeps will attack anemy structures --- swampy1/.jshintrc | 1 + swampy1/main.js | 12 ++++++------ swampy1/role.defense.js | 6 +++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/swampy1/.jshintrc b/swampy1/.jshintrc index b4f30b5..271a48a 100644 --- a/swampy1/.jshintrc +++ b/swampy1/.jshintrc @@ -16,6 +16,7 @@ "FIND_MY_STRUCTURES" : false, "FIND_MY_CREEPS" : false, "FIND_HOSTILE_CREEPS" : false, + "FIND_HOSTILE_STRUCTURES" : false, "RESOURCE_ENERGY" : false, "STRUCTURE_TOWER" : false, diff --git a/swampy1/main.js b/swampy1/main.js index 9537eea..62ae967 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -52,12 +52,12 @@ module.exports.loop = function () { tower.heal(injured_creep); else { - var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { - filter: (structure) => structure.hits < structure.hitsMax - }); - if(closestDamagedStructure) { - tower.repair(closestDamagedStructure); - } + //var closestDamagedStructure = tower.pos.findClosestByRange(FIND_STRUCTURES, { + // filter: (structure) => structure.hits < structure.hitsMax + //}); + //if(closestDamagedStructure) { + // tower.repair(closestDamagedStructure); + //} } } diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index dc7524e..e465cee 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -138,7 +138,11 @@ function plan_all_squads() let squad = Memory.squads[name]; var enemies = enemies_map[squad.room_name]; if(!enemies) - enemies = enemies_map[squad.room_name] = Game.rooms[squad.room_name].find(FIND_HOSTILE_CREEPS); + { + let hostile_creeps = Game.rooms[squad.room_name].find(FIND_HOSTILE_CREEPS); + let hostile_structures = Game.rooms[squad.room_name].find(FIND_HOSTILE_STRUCTURES); + enemies = enemies_map[squad.room_name] = [].concat(hostile_creeps,hostile_structures); + } _plan_squad(name, enemies); } } From 1abe3a0caad1e23ee0510cc1703f65917023aa9d Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 17:21:29 -0500 Subject: [PATCH 112/123] restructure army slightly --- swampy1/TODO.txt | 5 ++++- swampy1/lil_army.js | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 6f8e4b2..53086ea 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,4 +1,7 @@ -USE TOWER AS A HEALER + + rally point near last enemies + structure destruction + faster levelling of controller diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index 485c02b..cdd0a5c 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -15,7 +15,8 @@ let _army_composition = {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 5}, {"model":"baby_harvester", "count" : 12, "min_energy_class":550}, - {"model":"killbot", "count" : 9}, + {"model":"killbot", "count" : 3}, + {"model":"baby_harvester", "count" : 15, "min_energy_class":850}, ]; let models = From dcee67051cc969ab61e503adf1e83e8954c31d98 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 17:38:37 -0500 Subject: [PATCH 113/123] prioritize build of tower --- swampy1/mining_planner.js | 14 ++++++++++++++ swampy1/role.harvester.js | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 53e83bc..156dfab 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -142,7 +142,21 @@ function refresh_room_mining_plan(room_name) // find building targets let build_targets = room.find(FIND_CONSTRUCTION_SITES); if(build_targets.length) + { mine_map.to_build = build_targets.map( a => a.id); + + mine_map.to_build = mine_map.to_build.sort( function(a,b) + { + if( a.structureType != b.structureType ) + { + if( a.structureType === STRUCTURE_TOWER ) + return -1; + else if( b.structureType === STRUCTURE_TOWER ) + return 1; + } + return a.id - b.id; + }); + } else mine_map.to_build = null; } diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index c5de70e..f00625a 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -111,7 +111,7 @@ let roleHarvester = { else if( retv === ERR_FULL) { //finished repairs -notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); + notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); creep.memory.mode = rmap[creep.memory.role]; } else if( retv == ERR_NOT_IN_RANGE ) From ad1539f0dd6bc4f89c055f013b4ff2554936ed58 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 17:41:38 -0500 Subject: [PATCH 114/123] fix failed build sort --- swampy1/mining_planner.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 156dfab..3a80067 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -143,9 +143,7 @@ function refresh_room_mining_plan(room_name) let build_targets = room.find(FIND_CONSTRUCTION_SITES); if(build_targets.length) { - mine_map.to_build = build_targets.map( a => a.id); - - mine_map.to_build = mine_map.to_build.sort( function(a,b) + build_targets = build_targets.sort( function(a,b) { if( a.structureType != b.structureType ) { @@ -156,6 +154,8 @@ function refresh_room_mining_plan(room_name) } return a.id - b.id; }); + + mine_map.to_build = build_targets.map( a => a.id); } else mine_map.to_build = null; From a0b7433dd6239e907e51bac3f051b2afa7500218 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 17:58:11 -0500 Subject: [PATCH 115/123] add repair loop to builders --- swampy1/TODO.txt | 7 +++-- swampy1/mining_planner.js | 21 +++++++++++++++ swampy1/role.harvester.js | 57 ++++++++++++++++++++++++++++++--------- 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 53086ea..8477e7f 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,7 +1,10 @@ - rally point near last enemies - structure destruction + rally point near last enemies ?? guarding mode? + structure destruction - does it mnot work?? faster levelling of controller + + builders should repair damaged buildings + diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 3a80067..ad6dec3 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -159,6 +159,13 @@ function refresh_room_mining_plan(room_name) } else mine_map.to_build = null; + + var dmgd_structure = room.find(FIND_STRUCTURES, { + filter: (structure) => structure.hits < structure.hitsMax + }); + + mine_map.to_repair = dmgd_structure; + } function _allocate_creep_to_mine(mine_map, creep) @@ -255,6 +262,19 @@ function request_build_target(creep) return null; return mine_map.to_build[0]; } +function request_repair_target(creep) +{ + let room_name = creep.room.name; + if(! Memory.mining_map || !Memory.mining_map[room_name]) + { + notice(`Creep ${creep.name} has no mining map to be allocated to!`); + return null; + } + let mine_map = Memory.mining_map[room_name]; + if(! mine_map.to_repair) + return null; + return mine_map.to_repair[0]; +} function request_retrieve_target(creep) { let room_name = creep.room.name; @@ -295,6 +315,7 @@ module.exports = request_mining_target: request_mining_target, request_retrieve_target: request_retrieve_target, request_build_target: request_build_target, + request_repair_target: request_repair_target, reset_mining_plan : reset_mining_plan, get_spawn_id : get_spawn_id, }; diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index f00625a..39657c1 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -22,18 +22,15 @@ let roleHarvester = { { creep.memory.mode = "renew"; } - else if( creep.memory.mode === "retrieve" || creep.memory.mode === "build" || creep.memory.mode === "upgrade" ) + else if(creep.carry.energy < 1 ) { - if(creep.carry.energy < 1 ) + //notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); + if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) { - //notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); - if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) - { - creep.memory.mode = "renew"; - } - else - creep.memory.mode = "harvest"; + creep.memory.mode = "renew"; } + else + creep.memory.mode = "harvest"; } else if( creep.memory.mode === "harvest" ) { @@ -66,6 +63,32 @@ let roleHarvester = { creep.moveTo(source); } } + else if( creep.memory.mode === "repair" ) + { + let repair_target = roleHarvester.work_api.request_repair_target(creep); + repair_target = Game.getObjectById(repair_target); + if(repair_target) + { + util.set_doing_state(creep, "repair"); + let res = creep.repair(repair_target, RESOURCE_ENERGY); + if(res == ERR_NOT_IN_RANGE) + { + creep.moveTo(repair_target); + }else if (res === OK) + { + }else + notice(`creep ${creep.name} failed to repair: ${res}`); + + } + else + { + //No building to work on, fall back to next work + if( creep.memory.role === 'harvester' ) + creep.memory.mode = "upgrade"; + else + creep.memory.mode = "retrieve"; + } + } else if( creep.memory.mode === "build" ) { let build_target = roleHarvester.work_api.request_build_target(creep); @@ -84,11 +107,19 @@ let roleHarvester = { } else { - //No building to work on, fall back to next work - if( creep.memory.role === 'harvester' ) - creep.memory.mode = "upgrade"; + let repair_target = roleHarvester.work_api.request_repair_target(creep); + if(creep.memory.role === "builder" && repair_target) + { + creep.memory.mode = "repair"; + } else - creep.memory.mode = "retrieve"; + { + //No building to work on, fall back to next work + if( creep.memory.role === 'harvester' ) + creep.memory.mode = "upgrade"; + else + creep.memory.mode = "retrieve"; + } } } else if ( creep.memory.mode === "renew" ) From bed9af2ec5177ad94b622382eb43941d3ce8e534 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Mon, 12 Dec 2016 18:08:09 -0500 Subject: [PATCH 116/123] fix repair planner --- swampy1/mining_planner.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index ad6dec3..8dac237 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -164,7 +164,10 @@ function refresh_room_mining_plan(room_name) filter: (structure) => structure.hits < structure.hitsMax }); - mine_map.to_repair = dmgd_structure; + if(dmgd_structure) + mine_map.to_repair = dmgd_structure.map( a => a.id); + else + mine_map.to_repair = null; } From 22fd818925468931ba7e0788ff0c27c9990734f0 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Tue, 13 Dec 2016 09:43:08 -0500 Subject: [PATCH 117/123] fix renewal logic --- swampy1/TODO.txt | 2 +- swampy1/role.harvester.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index 8477e7f..d5d07e3 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -3,8 +3,8 @@ rally point near last enemies ?? guarding mode? structure destruction - does it mnot work?? + no effect of attacking a structyure with ranged weapons... sad faster levelling of controller - builders should repair damaged buildings diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 39657c1..1ef9317 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -22,7 +22,7 @@ let roleHarvester = { { creep.memory.mode = "renew"; } - else if(creep.carry.energy < 1 ) + else if(creep.carry.energy < 1 && creep.memory.mode != "renew" && creep.memory.mode != "harvest") { //notice(`Creep ${creep.name} has ${creep.ticksToLive} ticks to live and is ${Memory.max_energy - creep.memory.cost} costpenalty`); if(creep.ticksToLive < 312 && (Memory.max_energy - creep.memory.cost) <= 50 ) From 8245eb4f2fe5a34e1405850b2bc398e860cae2be Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 14 Dec 2016 10:36:26 -0500 Subject: [PATCH 118/123] avoid dangerous source keepers --- swampy1/TODO.txt | 16 +++++++++------- swampy1/mining_planner.js | 27 +++++++++++++++++++++++---- swampy1/role.defense.js | 2 +- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index d5d07e3..cb0fd0f 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,10 +1,12 @@ + source keeper lair cannot be dealt with + utterly immune + + options: scaffolding? + wall in + scaffolding + mining plan: exclude source keepers + note which sources have a enemy structure within 5 squares + exclude them so long as any enemy creep is on the field - rally point near last enemies ?? guarding mode? - structure destruction - does it mnot work?? - no effect of attacking a structyure with ranged weapons... sad - faster levelling of controller - - - + will still suffer losses when they spawn... diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 8dac237..27c37d4 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -14,6 +14,7 @@ function analyze_room(room_name) let room = Game.rooms[room_name]; var spawn = room.find( FIND_MY_STRUCTURES, {filter: {structureType: STRUCTURE_SPAWN}})[0]; let sources = room.find(FIND_SOURCES); + let enemy_structures = room.find(FIND_HOSTILE_STRUCTURES); // find all minable nodes, order by distance for( let ndx in sources) { @@ -44,10 +45,17 @@ function analyze_room(room_name) source.is_not_wall_count += 1; } + + if( enemy_structures !== null ) + { + let range = source.pos.findClosestByRange(enemy_structures); + source.dangerous = range && (source.pos.getRangeTo(range.pos) <= 5); + } } + //sort nearest to furthest sources = sources.sort((a,b) => a.dis_to_spawn - b.dis_to_spawn); - sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}, "is_not_wall_count":src.is_not_wall_count }) ); + sources = sources.map((src) => ({id:src.id, dist:src.dis_to_spawn, harvs:{}, "is_not_wall_count":src.is_not_wall_count, "dangerous": src.dangerous }) ); sources.forEach( (source) => notice(`Source ${source.id} Distance to spawn = ${source.dist}`)); // plan how many miners per node (more per distance? Path? Road? Etc. start with roundly robins) for( let ndx in sources) @@ -60,10 +68,12 @@ function analyze_room(room_name) } notice(`Source ${source.id} required_harvesters=${source.required_harvesters} not_wall_count= ${source.is_not_wall_count}`); } + let src_map = {}; sources.map( src => src_map[src.id] = src ); Memory.mining_map[room_name].sources = src_map; Memory.mining_map[room_name].spawnid = spawn.id; + return; } @@ -160,7 +170,7 @@ function refresh_room_mining_plan(room_name) else mine_map.to_build = null; - var dmgd_structure = room.find(FIND_STRUCTURES, { + let dmgd_structure = room.find(FIND_STRUCTURES, { filter: (structure) => structure.hits < structure.hitsMax }); @@ -169,6 +179,8 @@ function refresh_room_mining_plan(room_name) else mine_map.to_repair = null; + let enem = room.find(FIND_HOSTILE_CREEPS); + mine_map.enemies_present = enem !== null && enem.length > 0; } function _allocate_creep_to_mine(mine_map, creep) @@ -291,6 +303,7 @@ function request_retrieve_target(creep) return null; return mine_map.retrieve_to[0]; } + //request mining target(room, creep) function request_mining_target(creep) { @@ -301,14 +314,20 @@ function request_mining_target(creep) return null; } let mine_map = Memory.mining_map[room_name]; + function _safen_mining_target(srcid) + { + if(mine_map.enemies_present && mine_map.sources[srcid].dangerous) + return null; + return srcid; + } // if in mining set, return its target if( null != mine_map.harvs[creep.name] ) { - return mine_map.harvs[creep.name].assigned_to; + return _safen_mining_target(mine_map.harvs[creep.name].assigned_to); } // add to miners set // allocate to proper node - return _allocate_creep_to_mine(mine_map, creep); + return _safen_mining_target(_allocate_creep_to_mine(mine_map, creep)); } module.exports = diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index e465cee..0e0e46e 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -140,7 +140,7 @@ function plan_all_squads() if(!enemies) { let hostile_creeps = Game.rooms[squad.room_name].find(FIND_HOSTILE_CREEPS); - let hostile_structures = Game.rooms[squad.room_name].find(FIND_HOSTILE_STRUCTURES); + let hostile_structures = [];//Game.rooms[squad.room_name].find(FIND_HOSTILE_STRUCTURES); enemies = enemies_map[squad.room_name] = [].concat(hostile_creeps,hostile_structures); } _plan_squad(name, enemies); From 3b9567fb99d7308ce4a891be412f781165d425d2 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 14 Dec 2016 11:27:44 -0500 Subject: [PATCH 119/123] Dont cache mining targets so can respond to stop orders --- swampy1/TODO.txt | 7 +++++++ swampy1/role.harvester.js | 9 +++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index cb0fd0f..f869ca3 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,4 +1,6 @@ + linera tick naming util? + source keeper lair cannot be dealt with utterly immune @@ -10,3 +12,8 @@ exclude them so long as any enemy creep is on the field will still suffer losses when they spawn... + + + specialized mining algorithm major refactor + digger and hauler pattern + diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index 1ef9317..ef54ebe 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -48,13 +48,10 @@ let roleHarvester = { if( creep.memory.mode === "harvest" ) { + creep.memory.harvest_from_src_id = roleHarvester.work_api.request_mining_target(creep); + if(creep.memory.harvest_from_src_id == null ) - { - creep.memory.harvest_from_src_id = roleHarvester.work_api.request_mining_target(creep); - - if(creep.memory.harvest_from_src_id == null ) - return; - } + return; let source = Game.getObjectById(creep.memory.harvest_from_src_id); From 01b1fcd0b0cd3ea77f152aa4d214e741e875c2b1 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 14 Dec 2016 13:44:30 -0500 Subject: [PATCH 120/123] dont crash with memoryless stuff.... --- swampy1/reports.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swampy1/reports.js b/swampy1/reports.js index 7c80017..7584b30 100644 --- a/swampy1/reports.js +++ b/swampy1/reports.js @@ -9,6 +9,8 @@ function report_creep_makes(longform) let Crpname = creep.name; let role = creep.memory.role; let model = creep.memory.model; + if (! model) + continue; let body = {}; let body_str = []; for(let part_no in creep.body) From 63501292afa87e0d75c02618aed1b7105e457016 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 14 Dec 2016 14:02:46 -0500 Subject: [PATCH 121/123] Improve mining: dont get into wars before tower could beup --- swampy1/lil_army.js | 2 +- swampy1/mining_planner.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index cdd0a5c..d89f5b6 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -14,7 +14,7 @@ let _army_composition = {"model":"baby_builder", "count": 1}, {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 5}, - {"model":"baby_harvester", "count" : 12, "min_energy_class":550}, + {"model":"baby_harvester", "count" : 12, "min_energy_class":600}, {"model":"killbot", "count" : 3}, {"model":"baby_harvester", "count" : 15, "min_energy_class":850}, ]; diff --git a/swampy1/mining_planner.js b/swampy1/mining_planner.js index 27c37d4..c853ed5 100644 --- a/swampy1/mining_planner.js +++ b/swampy1/mining_planner.js @@ -4,6 +4,7 @@ const util = require('util'); const notice = util.mk_notice("mining_planner"); // Memory.mining_map +const MAX_MINERS_PER_NODE = 5; //analyze a given room function analyze_room(room_name) @@ -61,8 +62,8 @@ function analyze_room(room_name) for( let ndx in sources) { let source = sources[ndx]; - source.required_harvesters = 3; - if(source.is_not_wall_count < 3) + source.required_harvesters = MAX_MINERS_PER_NODE; + if(source.is_not_wall_count < MAX_MINERS_PER_NODE) { source.required_harvesters = source.is_not_wall_count + 1; } From 1ada6caf9fcb64979c668f994940ffdb29018410 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Wed, 14 Dec 2016 15:52:30 -0500 Subject: [PATCH 122/123] blockade source keepers with attack units --- swampy1/lil_army.js | 2 +- swampy1/role.defense.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/swampy1/lil_army.js b/swampy1/lil_army.js index d89f5b6..dc8e0eb 100644 --- a/swampy1/lil_army.js +++ b/swampy1/lil_army.js @@ -15,7 +15,7 @@ let _army_composition = {"model":"baby_upgrader", "count" : 1}, {"model":"baby_harvester", "count" : 5}, {"model":"baby_harvester", "count" : 12, "min_energy_class":600}, - {"model":"killbot", "count" : 3}, + {"model":"killbot", "count" : 5}, {"model":"baby_harvester", "count" : 15, "min_energy_class":850}, ]; diff --git a/swampy1/role.defense.js b/swampy1/role.defense.js index 0e0e46e..4c33b50 100644 --- a/swampy1/role.defense.js +++ b/swampy1/role.defense.js @@ -18,6 +18,18 @@ function _form_new_squad(room_name) "rally_point" : {"x" : 20, "y" : 27}, }; Memory.squads[new_squad.name] = new_squad; + let room = Game.rooms[room_name]; + if(room) + { + let hostile_buildings = room.find(FIND_HOSTILE_STRUCTURES); + if(hostile_buildings && hostile_buildings.length > 0) + { + let topos = hostile_buildings[0].pos; + new_squad.rally_point.x = topos.x; + new_squad.rally_point.y = topos.y; + } + } + notice(`Form new squad ${new_squad.name}`); return new_squad; } From 77330c498b1cdd3ed3b7ade1ab4debfc5a8ea197 Mon Sep 17 00:00:00 2001 From: Jason Maiorana Date: Thu, 15 Dec 2016 14:38:20 -0500 Subject: [PATCH 123/123] Try to batch renews into FIFO --- swampy1/TODO.txt | 7 ++- swampy1/main.js | 1 + swampy1/role.harvester.js | 96 +++++++++++++++++++++++++++++---------- 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/swampy1/TODO.txt b/swampy1/TODO.txt index f869ca3..22ff807 100644 --- a/swampy1/TODO.txt +++ b/swampy1/TODO.txt @@ -1,5 +1,10 @@ - linera tick naming util? + + renewal should be a linear thing + add a separate loop? Dont do in tick order? + + linear tick naming util? + source keeper lair cannot be dealt with utterly immune diff --git a/swampy1/main.js b/swampy1/main.js index 62ae967..7c2ecea 100644 --- a/swampy1/main.js +++ b/swampy1/main.js @@ -86,6 +86,7 @@ module.exports.loop = function () { roleDefense.run(creep); } } + roleHarvester.run_all_renewals(cur_room); if((Game.time % 25) === 0) { diff --git a/swampy1/role.harvester.js b/swampy1/role.harvester.js index ef54ebe..8767eb3 100644 --- a/swampy1/role.harvester.js +++ b/swampy1/role.harvester.js @@ -5,6 +5,7 @@ const notice = util.mk_notice("mining_map"); const rmap = {"builder":"build", "harvester":"retrieve", "upgrader":"upgrade"}; + let roleHarvester = { alloc_func : null, @@ -14,7 +15,6 @@ let roleHarvester = { roleHarvester.work_api = work_allcator; }, - /** @param {Creep} creep **/ run: function(creep) { @@ -122,30 +122,7 @@ let roleHarvester = { else if ( creep.memory.mode === "renew" ) { util.set_doing_state(creep, "renew"); - let spawnid = roleHarvester.work_api.get_spawn_id(creep); - let spawn = Game.getObjectById(spawnid); - let retv = spawn.renewCreep(creep); - if(retv == OK) - { - //notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); - } - else if(retv === ERR_NOT_ENOUGH_ENERGY) - { - //give energy to spawn if have any - creep.transfer(spawn, RESOURCE_ENERGY); - //otherwise idle - //notice(`Creep ${creep.name} needs to wait to get recharged`); - } - else if( retv === ERR_FULL) - { - //finished repairs - notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); - creep.memory.mode = rmap[creep.memory.role]; - } - else if( retv == ERR_NOT_IN_RANGE ) - { - creep.moveTo(spawn); - } + _add_to_renew_map(creep.room, creep); } else if( creep.memory.mode === "upgrade" ) { @@ -180,4 +157,73 @@ let roleHarvester = { } }; +function _add_to_renew_map(room, creep) +{ + if(! Memory.renew_queue ) + { + Memory.renew_queue = {}; + Memory.renew_creeps = {}; + } + if(! Memory.renew_queue[room.name]) + Memory.renew_queue[room.name] = []; + if(!Memory.renew_creeps[creep.name]) + { + Memory.renew_queue[room.name].push({"name":creep.name}); + Memory.renew_creeps[creep.name] = 1; + } +} +function run_all_renewals(room) +{ + if(! Memory.renew_queue || ! Memory.renew_queue[room.name]) + return; + let renew_queue = Memory.renew_queue[room.name]; + //filter out all invalid entires in the set + let creeps = []; + let new_rq = []; + for( let ndx in renew_queue) + { + let entry = renew_queue[ndx]; + let creep = Game.creeps[entry.name]; + if(creep && creep.memory.mode === "renew" && creep.pos.roomName === room.name) + { + creeps.push(creep); + new_rq.push(entry); + } + else + { + Memory.renew_creeps[entry.name] = 0; + } + } + for( let ndx in creeps) + { + let creep = creeps[ndx]; + + let spawnid = roleHarvester.work_api.get_spawn_id(creep); + let spawn = Game.getObjectById(spawnid); + let retv = spawn.renewCreep(creep); + if(retv == OK) + { + //notice(`Creep ${creep.name} has RECHARGED TO ${creep.ticksToLive} `); + } + else if(retv === ERR_NOT_ENOUGH_ENERGY) + { + //give energy to spawn if have any + creep.transfer(spawn, RESOURCE_ENERGY); + //otherwise idle + //notice(`Creep ${creep.name} needs to wait to get recharged`); + } + else if( retv === ERR_FULL) + { + //finished repairs + notice(`Creep ${creep.name} has RECHARGED TO FULL @ ${creep.ticksToLive} `); + creep.memory.mode = rmap[creep.memory.role]; + } + else if( retv == ERR_NOT_IN_RANGE ) + { + creep.moveTo(spawn); + } + } +} +roleHarvester.run_all_renewals = run_all_renewals; + module.exports = roleHarvester;