diff --git a/battle.js b/battle.js index 00a9fc1..320434f 100644 --- a/battle.js +++ b/battle.js @@ -1,55 +1,52 @@ -// usernames are all lowercase, we compare with to lower -var USERNAME_WHITELIST = ['chrisinajar', 'ho0ber', 'fractaloop', 'n7-anthony', 'overra', 'tyrel', 'fervens']; - -module.exports = { - findEnemy: findEnemy, - run: run -}; - -/* - var target = findEnemy(creep); -*/ -function findEnemy (creep) { - var targets = creep.room.find(FIND_HOSTILE_CREEPS, { - filter: (c) => { - return (USERNAME_WHITELIST.indexOf(c.owner.username.toLowerCase()) === -1); - } - }); - if (!targets.length) { - return creep.room.controller; - } - return creep.pos.findClosestByPath(targets); -} - -function run (creep) { - var target = findEnemy(creep); - if (!target) { - target = findWall(creep); - // getDirectionTo - if (!creep.pos.isNearTo(target)) { - return creep.moveTo(target); - } else { - creep.attack(target); - } - var direction = creep.pos.getDirectionTo(target); - creep.memory.wallDirection = direction; - } else { - creep.moveTo(target); - creep.attack(target); - } -} - -function findWall (creep) { - var targets = creep.room.find(FIND_STRUCTURES, { - filter: function(object) { - if (object.my) { - return false; - } - if (object.structureType !== STRUCTURE_TOWER && object.structureType !== STRUCTURE_WALL) { - return false; - } - return true; - } - }); - return creep.pos.findClosestByPath(targets); -} \ No newline at end of file +// usernames are all lowercase, we compare with to lower +var USERNAME_WHITELIST = ['chrisinajar', 'ho0ber', 'fractaloop', 'n7-anthony', 'overra', 'tyrel', 'fervens']; + +module.exports = { + findEnemy: findEnemy, + run: run +}; + +function findEnemy (searcher) { + var targets = searcher.room.find(FIND_HOSTILE_CREEPS, { + filter: (c) => { + return (USERNAME_WHITELIST.indexOf(c.owner.username.toLowerCase()) === -1); + } + }); + if (!targets.length) { + return searcher.room.controller; + } + return searcher.pos.findClosestByPath(targets); +} + +function run (creep) { + var target = findEnemy(creep); + if (!target) { + target = findWall(creep); + // getDirectionTo + if (!creep.pos.isNearTo(target)) { + return creep.moveTo(target); + } else { + creep.attack(target); + } + var direction = creep.pos.getDirectionTo(target); + creep.memory.wallDirection = direction; + } else { + creep.moveTo(target); + creep.attack(target); + } +} + +function findWall (creep) { + var targets = creep.room.find(FIND_STRUCTURES, { + filter: function(object) { + if (object.my) { + return false; + } + if (object.structureType !== STRUCTURE_TOWER && object.structureType !== STRUCTURE_WALL) { + return false; + } + return true; + } + }); + return creep.pos.findClosestByPath(targets); +} diff --git a/helpers.js b/helpers.js index 7011e0a..b18e345 100644 --- a/helpers.js +++ b/helpers.js @@ -1,16 +1,16 @@ -var helpers = { - generateName: function(role){ - return role + '_xxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); - }, - getLastFlag: function(flagName){ - return _(Object.keys(Game.flags)) - .filter((f) => f.startsWith(flagName)) - .map((f) => f.slice(flagName.length)) - .max(); - }, -}; - +var helpers = { + generateName: function(role){ + return role + '_xxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + }, + getLastFlag: function(flagName){ + return _(Object.keys(Game.flags)) + .filter((f) => f.startsWith(flagName)) + .map((f) => f.slice(flagName.length)) + .max(); + }, +}; + module.exports = helpers; \ No newline at end of file diff --git a/main.js b/main.js index 12efb7a..0b679a1 100644 --- a/main.js +++ b/main.js @@ -1,74 +1,74 @@ -var roleHarvester = require('role.harvester'); -var roleUpgrader = require('role.upgrader'); -var roleBuilder = require('role.builder'); -var roleGuard = require('role.guard'); -var helpers = require('helpers'); - -var creepRolePriority = ['harvester', 'builder', 'upgrader', 'guard']; -var creepsConfig = { - harvester: { - bodyParts: [WORK, CARRY, MOVE, MOVE, MOVE], - minimumCreeps: 3, - role: roleHarvester - }, - builder: { - bodyParts: [WORK, CARRY, MOVE, MOVE], - minimumCreeps: 2, - role: roleBuilder - }, - upgrader: { - bodyParts: [WORK, CARRY, CARRY, MOVE, MOVE], - minimumCreeps: 6, - role: roleUpgrader - }, - guard: { - bodyParts: [TOUGH, MOVE, ATTACK, MOVE, ATTACK], - minimumCreeps: 3, - role: roleGuard, - } -}; - - -module.exports.loop = function(){ - console.log(' '); - // Cleanup Creeps - for (var name in Memory.creeps){ - if (!Game.creeps[name]){ - delete Memory.creeps[name]; - console.log('Cleaning non-existing creep memory:', name); - } - - } - - // Refactor some similar behavior for all roles - for (var i in creepRolePriority){ - var roleName = creepRolePriority[i]; - var defaults = creepsConfig[roleName]; - - let creepsOfKind = _.filter(Game.creeps, (creep) => {return creep.memory.role == roleName}); - if (creepsOfKind.length < defaults.minimumCreeps){ - var newName = Game.spawns.Spawn1.createCreep(defaults.bodyParts, - helpers.generateName(roleName), // Make names show the roles. Change me to undefined if this gets annoying. - {role: roleName}); - if(newName == ERR_NOT_ENOUGH_ENERGY){ - console.log('not enough resources to spawn'); - } else { - console.log('Spawning', newName); - } - } - } - - // Run stuff for each creep - var roleCounts = {harvester: 0, builder: 0, upgrader: 0, guard: 0}; - var expected = _(creepsConfig).mapValues('minimumCreeps'); - - for (var name in Game.creeps){ - var creep = Game.creeps[name]; - var role = creep.memory.role; - roleCounts[role] += 1; - creepsConfig[role].role.run(creep); - } - console.log('current\t', JSON.stringify(roleCounts)); - console.log('expect\t', JSON.stringify(expected)); - console.log('#############################################################'); -}; +var roleHarvester = require('role.harvester'); +var roleUpgrader = require('role.upgrader'); +var roleBuilder = require('role.builder'); +var roleGuard = require('role.guard'); +var helpers = require('helpers'); + +var creepRolePriority = ['harvester', 'builder', 'upgrader', 'guard']; +var creepsConfig = { + harvester: { + bodyParts: [WORK, CARRY, MOVE, MOVE, MOVE], + minimumCreeps: 4, + role: roleHarvester + }, + builder: { + bodyParts: [WORK, CARRY, MOVE, MOVE], + minimumCreeps: 4, + role: roleBuilder + }, + upgrader: { + bodyParts: [WORK, CARRY, CARRY, MOVE, MOVE], + minimumCreeps: 4, + role: roleUpgrader + }, + guard: { + bodyParts: [TOUGH, MOVE, ATTACK, MOVE, ATTACK], + minimumCreeps: 4, + role: roleGuard, + } +}; + + +module.exports.loop = function(){ + console.log(' '); + // Cleanup Creeps + for (var name in Memory.creeps){ + if (!Game.creeps[name]){ + delete Memory.creeps[name]; + console.log('Cleaning non-existing creep memory:', name); + } + + } + + // Refactor some similar behavior for all roles + for (var i in creepRolePriority){ + var roleName = creepRolePriority[i]; + var defaults = creepsConfig[roleName]; + + let creepsOfKind = _.filter(Game.creeps, (creep) => {return creep.memory.role == roleName}); + if (creepsOfKind.length < defaults.minimumCreeps){ + var newName = Game.spawns.Spawn1.createCreep(defaults.bodyParts, + helpers.generateName(roleName), // Make names show the roles. Change me to undefined if this gets annoying. + {role: roleName}); + if(newName == ERR_NOT_ENOUGH_ENERGY){ + console.log('not enough resources to spawn'); + } else { + console.log('Spawning', newName); + } + } + } + + // Run stuff for each creep + var roleCounts = {harvester: 0, builder: 0, upgrader: 0, guard: 0}; + var expected = _(creepsConfig).mapValues('minimumCreeps'); + + for (var name in Game.creeps){ + var creep = Game.creeps[name]; + var role = creep.memory.role; + roleCounts[role] += 1; + creepsConfig[role].role.run(creep); + } + console.log('current\t', JSON.stringify(roleCounts)); + console.log('expect\t', JSON.stringify(expected)); + console.log('#############################################################'); +}; diff --git a/role.builder.js b/role.builder.js index 0aebba6..d28678a 100644 --- a/role.builder.js +++ b/role.builder.js @@ -1,28 +1,28 @@ -var BreakException= {}; - -var roleBuilder = { - run: function(creep){ - if(creep.memory.building && creep.carry.energy == 0){ - creep.memory.building = false; - } - 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); - - var transferErrorCode = creep.build(targets[0]); - if(transferErrorCode == 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; +var BreakException= {}; + +var roleBuilder = { + run: function(creep){ + if(creep.memory.building && creep.carry.energy == 0){ + creep.memory.building = false; + } + 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); + + var transferErrorCode = creep.build(targets[0]); + if(transferErrorCode == 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/role.harvester.js b/role.harvester.js index e2bf528..f5ce22b 100644 --- a/role.harvester.js +++ b/role.harvester.js @@ -1,32 +1,32 @@ -var roleHarvester = { - - /** @param {Creep} creep **/ - run: function(creep) { - console.log(creep, 'running Harvest'); - if(creep.carry.energy < creep.carryCapacity) { - var source = creep.pos.findClosestByPath(FIND_SOURCES); - if(creep.harvest(source) == ERR_NOT_IN_RANGE) { - console.log('\tmoving to', source); - creep.moveTo(source); - } - } - 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) { - console.log('\tmoving to', targets[0]); - creep.moveTo(targets[0]); - } - } - } - } -}; - +var roleHarvester = { + + /** @param {Creep} creep **/ + run: function(creep) { + console.log(creep, 'running Harvest'); + if(creep.carry.energy < creep.carryCapacity) { + var source = creep.pos.findClosestByPath(FIND_SOURCES); + if(creep.harvest(source) == ERR_NOT_IN_RANGE) { + console.log('\tmoving to', source); + creep.moveTo(source); + } + } + 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) { + console.log('\tmoving to', targets[0]); + creep.moveTo(targets[0]); + } + } + } + } +}; + module.exports = roleHarvester; \ No newline at end of file diff --git a/role.upgrader.js b/role.upgrader.js index 77a7024..e6ae8fa 100644 --- a/role.upgrader.js +++ b/role.upgrader.js @@ -1,26 +1,26 @@ -var roleUpgrader = { - - /** @param {Creep} creep **/ - run: function(creep) { - if(creep.memory.upgrading && creep.carry.energy == 0) { - creep.memory.upgrading = false; - } - if(!creep.memory.upgrading && creep.carry.energy == creep.carryCapacity) { - creep.memory.upgrading = true; - } - - if(creep.memory.upgrading) { - if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) { - creep.moveTo(creep.room.controller); - } - } - else { - var source = creep.pos.findClosestByPath(FIND_SOURCES); - if(creep.harvest(source) == ERR_NOT_IN_RANGE) { - creep.moveTo(source); - } - } - } -}; - +var roleUpgrader = { + + /** @param {Creep} creep **/ + run: function(creep) { + if(creep.memory.upgrading && creep.carry.energy == 0) { + creep.memory.upgrading = false; + } + if(!creep.memory.upgrading && creep.carry.energy == creep.carryCapacity) { + creep.memory.upgrading = true; + } + + if(creep.memory.upgrading) { + if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) { + creep.moveTo(creep.room.controller); + } + } + else { + var source = creep.pos.findClosestByPath(FIND_SOURCES); + if(creep.harvest(source) == ERR_NOT_IN_RANGE) { + creep.moveTo(source); + } + } + } +}; + module.exports = roleUpgrader; \ No newline at end of file diff --git a/structure.tower.js b/structure.tower.js new file mode 100644 index 0000000..af383fc --- /dev/null +++ b/structure.tower.js @@ -0,0 +1,38 @@ +var battle = require('battle') +//var helpers = require('helpers'); + +var structureTower= { + run: function(structure){ + this.structure = structure; + console.log(structure, 'running Tower') + + var target = battle.findEnemy(this.structure); + + if(target != structure.room.controller) { + console.log('\t', this.structure, 'attacking:',target) + this.structure.attack(target); + } else { + var damagedStructure = this.findDamagedStructure(); + if(damagedStructure){ + console.log("repairing", damagedStructure); + this.structure.repair(damagedStructure); + } + } + + }, + findDamagedStructure: function(searcher){ + var targets = searcher.room.find(FIND_STRUCTURES, { + filter: function(s){ + if(s.structureType == STRUCTURE_TOWER){ + return false; + } + if (s.hits < s.hitsMax){ + return true; + } + return false; + } + }); + return searcher.pos.findClosestByPath(targets); + } +} +module.exports = structureTower;