Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/Overseer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {DirectivePoisonRoom} from './directives/offense/poisonRoom';
import {Directive} from './directives/Directive';
import {Notifier} from './directives/Notifier';
import {DirectiveBootstrap} from './directives/situational/bootstrap';
import {DirectiveDismantle} from './directives/targeting/dismantle';
import {DirectiveNukeResponse} from './directives/situational/nukeResponse';
import {DirectiveTerminalEvacuateState} from './directives/terminalState/terminalState_evacuate';
import {RoomIntel} from './intel/RoomIntel';
Expand Down Expand Up @@ -203,10 +204,18 @@ export class Overseer implements IOverseer {
}
}
if (Game.time % 55 == 0) {
let cores = room.hostileStructures.filter(s => s.structureType.toString() == 'invaderCore');
if (cores.length > 0) {
let cores = room.hostileStructures.filter(s => s.structureType as any === 'invaderCore');
if (cores.length > 0 && <number>_.get(cores[0],['level']) == 0) {
log.alert(`Found core in ${room.name} with ${cores[0]}`);
let res = DirectiveModularDismantle.createIfNotPresent(cores[0].pos, 'pos');
DirectiveDismantle.createIfNotPresent(cores[0].pos, 'pos');
if (!!res) {
log.notify(`Creating stronghold clearing dismantle in room ${room.name}`);
}
} else if (cores.length > 0 && <number>_.get(cores[0],['level']) < 3) {
log.alert(`Found core in ${room.name} with ${cores[0]}`);
let res = DirectivePairDestroy.createIfNotPresent(cores[0].pos, 'pos', {name: ('pairDestroy:' + room.name)});
DirectiveDismantle.createIfNotPresent(cores[0].pos, 'pos');
if (!!res) {
log.notify(`Creating stronghold clearing dismantle in room ${room.name}`);
}
Expand Down
21 changes: 16 additions & 5 deletions src/creepSetups/setups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ export const Setups = {
}),

standardCPU: new CreepSetup(Roles.drone, {
pattern : [WORK, WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE, MOVE, WORK],
// pattern : [WORK, WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE, MOVE, WORK],
pattern: [ WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, CARRY, MOVE, MOVE, MOVE, MOVE, MOVE],
sizeLimit: 1,
}),

Expand All @@ -75,6 +76,12 @@ export const Setups = {
sourceKeeper: new CreepSetup(Roles.drone, {
pattern : [WORK, WORK, CARRY, MOVE],
sizeLimit: 5,
}),

sourceKeeperHeal: new CreepSetup(Roles.drone, {
pattern: [CARRY, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK, WORK,
MOVE, MOVE, MOVE, MOVE, MOVE, MOVE, HEAL],
sizeLimit: 1,
})
}
},
Expand Down Expand Up @@ -223,7 +230,8 @@ export const CombatSetups = {
zerglings: {

default: new CreepSetup(Roles.melee, {
pattern : [ATTACK, MOVE],
// pattern : [ATTACK, MOVE],
pattern : [MOVE, ATTACK],
sizeLimit: Infinity,
}),

Expand Down Expand Up @@ -280,7 +288,8 @@ export const CombatSetups = {
}),

default: new CreepSetup(Roles.ranged, {
pattern : [RANGED_ATTACK, RANGED_ATTACK, RANGED_ATTACK, MOVE, MOVE, MOVE, MOVE, HEAL],
// pattern : [RANGED_ATTACK, RANGED_ATTACK, RANGED_ATTACK, MOVE, MOVE, MOVE, MOVE, HEAL],
pattern: [MOVE, MOVE, MOVE, MOVE,RANGED_ATTACK, RANGED_ATTACK, HEAL, HEAL],
sizeLimit: Infinity,
}),

Expand Down Expand Up @@ -320,7 +329,8 @@ export const CombatSetups = {
healers: {

default: new CreepSetup(Roles.healer, {
pattern : [HEAL, MOVE],
// pattern : [HEAL, MOVE],
pattern : [MOVE, HEAL],
sizeLimit: Infinity,
}),

Expand All @@ -347,7 +357,8 @@ export const CombatSetups = {
}),

default: new CreepSetup(Roles.guardMelee, {
pattern : [TOUGH, ATTACK, ATTACK, ATTACK, MOVE, MOVE, MOVE, MOVE, MOVE, HEAL],
// pattern : [TOUGH, ATTACK, ATTACK, ATTACK, MOVE, MOVE, MOVE, MOVE, MOVE, HEAL],
pattern: [MOVE, MOVE, MOVE, MOVE,ATTACK, ATTACK,ATTACK, HEAL, HEAL, MOVE],
sizeLimit: Infinity,
}),

Expand Down
2 changes: 2 additions & 0 deletions src/declarations/memory.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ interface Memory {
settings: {
signature: string;
operationMode: operationMode;
resourcesBlackList: [string],
log: LoggerMemory;
enableVisuals: boolean;
allies: string[];
autoAttack: boolean;
resourceCollectionMode: resourceCollectionMode;
powerCollection: {
enabled: boolean;
Expand Down
6 changes: 3 additions & 3 deletions src/directives/defense/invasionDefense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ export class DirectiveInvasionDefense extends Directive {
// clean up, ya this shit
this.cleanUpPlayerMem();
}
if (this.room && (this.room!.name == 'W13N45' || this.room!.name == 'W18N49')) {
CombatIntel.computeCreepDamagePotentialMatrix(this.room, this.room.dangerousPlayerHostiles);
}
//if (this.room && (this.room!.name == 'W13N45' || this.room!.name == 'W18N49')) {
// CombatIntel.computeCreepDamagePotentialMatrix(this.room, this.room.dangerousPlayerHostiles);
//}
// If there are no hostiles left in the room and everyone's healed, then remove the flag
if (this.room && this.room.hostiles.length == 0 &&
(Game.time - this.memory.safeSince) > this.safeEndTime) {
Expand Down
5 changes: 1 addition & 4 deletions src/directives/offense/pairDestroy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ export class DirectivePairDestroy extends Directive {
static color = COLOR_RED;
static secondaryColor = COLOR_CYAN;

specialRooms: ['W16N53'];

overlords: {
destroy: PairDestroyerOverlord;
distraction: DistractionOverlord;
Expand All @@ -42,8 +40,7 @@ export class DirectivePairDestroy extends Directive {

run(): void {
// If there are no hostiles left in the room then remove the flag and associated healpoint
if (this.room && this.room.hostiles.length == 0 && this.room.hostileStructures.length == 0 && this.room.controller
&& this.room.name != 'W17N47' && this.room.name != 'W16N53' && this.room.name != 'W16N54') {
if (this.room && this.room.hostiles.length == 0 && this.room.hostileStructures.length == 0 && this.room.controller) {
log.notify(`Pair destroyer mission at ${this.pos.roomName} completed successfully.`);
this.remove();
}
Expand Down
175 changes: 35 additions & 140 deletions src/directives/powerCreeps/baseOperator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {Power} from "./powers/genericPower";
import {GenerateOps} from "./powers/generateOps";
import {DirectiveNukeResponse} from "../situational/nukeResponse";
import {OperateExtension} from "./powers/operateExtension";
import {OperateSource} from "./powers/operateSource";
import {OperateSpawn} from "./powers/operateSpawn";


interface DirectiveBaseOperatorMemory extends FlagMemory {
Expand Down Expand Up @@ -93,152 +95,48 @@ export class DirectiveBaseOperator extends Directive {

usePower(powerCreep: PowerCreep, power: PowerConstant) {
//console.log(`The power constant is ${power}`)
switch(power) {
switch (power) {
case PWR_GENERATE_OPS: return new GenerateOps(powerCreep);
case PWR_OPERATE_EXTENSION: return new OperateExtension(powerCreep);
// case PWR_OPERATE_SPAWN: return this.operateSpawn();
case PWR_REGEN_SOURCE: return new OperateSource(powerCreep);
case PWR_OPERATE_SPAWN: return new OperateSpawn(powerCreep);
}

}
//
// /**
// * Generate 1/2/4/6/8 ops resource units. Cooldown 50 ticks. Required creep level: 0/2/7/14/22.
// */
// generateOps() {
// if (powerCreep.powers[PWR_GENERATE_OPS].cooldown !> 0) {
// return powerCreep.usePower(PWR_GENERATE_OPS);
// }
// return ERR_TIRED;
// }
//
// operateSpawn(spawn?: StructureSpawn) {
// // if (powerCreep.powers[PWR_oper])
// // if (!spawn) {
// // spawn = _.first(this.room!.spawns.filter(spawn => spawn.effects.length == 0));
// // if (!spawn) {
// // return ERR;
// // }
// // }
// if (this.pos.inRangeToPos(spawn.pos, 1)) {
// return powerCreep.usePower(PWR_OPERATE_SPAWN, spawn);
// } else {
// return powerCreep.moveTo(spawn);
// }
// }
//
// operateTower(tower: StructureTower) {
// if (this.pos.inRangeToPos(tower.pos, POWER_INFO[PWR_OPERATE_TOWER].range)) {
// return powerCreep.usePower(PWR_OPERATE_TOWER, tower);
// } else {
// return powerCreep.moveTo(tower);
// }
// }
//
// operateStorage(storage: StructureStorage) {
// if (this.pos.inRangeToPos(storage.pos, POWER_INFO[PWR_OPERATE_STORAGE].range)) {
// return powerCreep.usePower(PWR_OPERATE_STORAGE, storage);
// } else {
// return powerCreep.moveTo(storage);
// }
// }
//
// operateExtensions(container: StructureStorage | StructureTerminal | StructureContainer) {
// if (this.pos.inRangeToPos(container.pos, POWER_INFO[PWR_OPERATE_EXTENSION].range)) {
// return powerCreep.usePower(PWR_OPERATE_EXTENSION, container);
// } else {
// return powerCreep.moveTo(container);
// }
// }
//
// operateObserver(observer: StructureObserver) {
// if (this.pos.inRangeToPos(observer.pos, POWER_INFO[PWR_OPERATE_OBSERVER].range)) {
// return powerCreep.usePower(PWR_OPERATE_OBSERVER, observer);
// } else {
// return powerCreep.moveTo(observer);
// }
// }
//
// operateTerminal(terminal: StructureTerminal) {
// if (this.pos.inRangeToPos(terminal.pos, POWER_INFO[PWR_OPERATE_TERMINAL].range)) {
// return powerCreep.usePower(PWR_OPERATE_TERMINAL, terminal);
// } else {
// return powerCreep.moveTo(terminal);
// }
// }
//
// operatePower(power: StructurePowerSpawn) {
// if (this.pos.inRangeToPos(power.pos, POWER_INFO[PWR_OPERATE_POWER].range)) {
// return powerCreep.usePower(PWR_OPERATE_POWER, power);
// } else {
// return powerCreep.moveTo(power);
// }
// }
//
// operateController(controller: StructureController) {
// if (this.pos.inRangeToPos(controller.pos, POWER_INFO[PWR_OPERATE_CONTROLLER].range)) {
// return powerCreep.usePower(PWR_OPERATE_CONTROLLER, controller);
// } else {
// return powerCreep.moveTo(controller);
// }
// }
//
// // operateFactory(factory: StructureFactory) {
// // if (this.pos.inRangeToPos(factory.pos, POWER_INFO[PWR_OPERATE_FACTORY].range)) {
// // return powerCreep.usePower(PWR_OPERATE_FACTORY, factory);
// // } else {
// // return this.moveTo(factory);
// // }
// // }
//
// shield() {
// if (powerCreep.powers[PWR_SHIELD].cooldown !> 0) {
// return powerCreep.usePower(PWR_SHIELD);
// }
// return ERR_TIRED;
// }
//
// regenSource(source : Source) {
// if (this.pos.inRangeToPos(source.pos, POWER_INFO[PWR_REGEN_SOURCE].range)) {
// return powerCreep.usePower(PWR_REGEN_SOURCE, source);
// } else {
// return powerCreep.moveTo(source);
// }
// }
//
// regenMineral(mineral: Mineral) {
// if (this.pos.inRangeToPos(mineral.pos, POWER_INFO[PWR_REGEN_MINERAL].range)) {
// return powerCreep.usePower(PWR_REGEN_MINERAL, mineral);
// } else {
// return powerCreep.moveTo(mineral);
// }
// }
//
// fortify(rampart: StructureRampart) {
// if (this.pos.inRangeToPos(rampart.pos, POWER_INFO[PWR_FORTIFY].range)) {
// return powerCreep.usePower(PWR_FORTIFY, rampart);
// } else {
// return powerCreep.moveTo(rampart);
// }
// }
//
// operateLab(lab: StructureLab) {
// if (this.pos.inRangeToPos(lab.pos, POWER_INFO[PWR_OPERATE_LAB].range)) {
// return powerCreep.usePower(PWR_OPERATE_LAB, lab);
// } else {
// return powerCreep.moveTo(lab);
// }
// }


runPowers(powerCreep: PowerCreep) {
let b = false;
let pri = 0;
const priorities = this.memory.powerPriorities;
for (let powerId in priorities) {
//console.log(`Powerid of ${powerId} and list of ${priorities}`);
let powerToUse = this.usePower(powerCreep, priorities[powerId]);
if (powerToUse && powerToUse.operatePower()) {
b = true;
pri = priorities[powerId];
break;
}
}
if(b == true){
return pri;
} else {
if(Game.flags[powerCreep.name]){
powerCreep.moveTo(Game.flags[powerCreep.name],
{ ignoreRoads: true, range: 0, swampCost: 1, reusePath: 0, visualizePathStyle:
{ lineStyle: "dashed", fill: 'yellow' } });
if(powerCreep.pos.isEqualTo(Game.flags[powerCreep.name])) {
powerCreep.usePower(PWR_SHIELD);
}
if(powerCreep.hits < powerCreep.hitsMax) {
if(powerCreep.room && powerCreep.room.controller && powerCreep.room.controller.my){
for (const tower of Overmind.colonies[powerCreep.room.name].towers) {
tower.heal(powerCreep);
}
console.log(`healing powerCreep ${powerCreep.name} in ${powerCreep.room.name} hits = ${powerCreep.hits}`)
}
}
}
return 'none';
}
}


Expand Down Expand Up @@ -267,27 +165,24 @@ export class DirectiveBaseOperator extends Directive {
// Spawn creep
let res = powerCreep.spawn(this.room.powerSpawn);
log.alert(`Running ${powerCreep} with spawn of ${res}`);
} else if (this.room.controller && !this.room.controller.isPowerEnabled) {
} else if (this.room.controller && this.room.controller.my && !this.room.controller.isPowerEnabled) {
// Enable power
let res = this.enablePower(powerCreep, this.room.controller);
log.alert(`Running ${powerCreep} with enable power of ${res}`);
} else if (powerCreep && powerCreep.ticksToLive && powerCreep.ticksToLive < 900 && this.room.powerSpawn) {
let res = this.renew(powerCreep, this.room.powerSpawn);
log.alert(`Running ${powerCreep} with renew of ${res}`);
} else {
let res = this.runPowers(powerCreep);
//log.alert(`Running ${powerCreep} with power of ${res}`);
}

if (this.room.hostiles.length > 2 || (powerCreep.pos && DirectiveNukeResponse.isPresent(powerCreep.pos, 'room'))) {
} else if (this.room.hostiles.length > 2 || (powerCreep.pos && DirectiveNukeResponse.isPresent(powerCreep.pos, 'room'))) {
const towersToBoost = this.colony.towers.filter(tower => !tower.effects || tower.effects.length == 0);
if (towersToBoost.length > 0) {
powerCreep.usePower(PWR_OPERATE_TOWER, towersToBoost[0])
}
if ((!powerCreep.carry.ops || powerCreep.carry.ops < 20) && this.room.storage && this.room.storage.store.ops && this.room.storage.store.ops > 100) {
powerCreep.withdraw(this.room.storage, RESOURCE_OPS, 100);
}
} else {
let res = this.runPowers(powerCreep);
//log.alert(`Running ${powerCreep} with power of ${res}`);
}
}

}
20 changes: 14 additions & 6 deletions src/directives/powerCreeps/powers/generateOps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,21 @@ export class GenerateOps extends Power {
const storage = this.powerCreep.room!.storage;
if (!storage) {
log.error(`Ops power creep with no storage`);
} else {
this.powerCreep.moveTo(storage);
this.powerCreep.transfer(storage, RESOURCE_OPS, this.powerCreep.carry.ops);
return false;
}
} else {
return this.powerCreep.usePower(powerId);
else {
this.powerCreep.moveTo(storage,
{ ignoreRoads: true, range: 1, swampCost: 1, reusePath: 0, visualizePathStyle:
{ lineStyle: "dashed", fill: 'yellow' } });
this.powerCreep.transfer(storage, RESOURCE_OPS, this.powerCreep.carry.ops - 200);
return true;
}
}
else if (this.powerCreep.room && this.powerCreep.powers[PWR_GENERATE_OPS]
&& this.powerCreep.powers[PWR_GENERATE_OPS].cooldown == 0) {
this.powerCreep.usePower(powerId);
return true;
}
return ERR_TIRED;
return false;
}
}
Loading