From 15797902ef03c678a091fc85fe204b883a225a33 Mon Sep 17 00:00:00 2001 From: Matthew Roy Date: Mon, 27 May 2019 14:58:53 -0700 Subject: [PATCH 1/4] Just for fun, a distraction Overlord for making creeps that just run away laughing --- src/creepSetups/setups.ts | 5 +++ src/overlords/defense/distraction.ts | 55 ++++++++++++++++++++++++++++ src/zerg/CombatZerg.ts | 8 ++-- 3 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/overlords/defense/distraction.ts diff --git a/src/creepSetups/setups.ts b/src/creepSetups/setups.ts index 1c57dcbee..98638a9c4 100644 --- a/src/creepSetups/setups.ts +++ b/src/creepSetups/setups.ts @@ -229,6 +229,11 @@ export const CombatSetups = { sizeLimit: Infinity, }), + distraction: new CreepSetup(Roles.ranged, { + pattern : [MOVE, MOVE, MOVE, RANGED_ATTACK, MOVE], + sizeLimit: 1, + }), + default: new CreepSetup(Roles.ranged, { pattern : [RANGED_ATTACK, RANGED_ATTACK, RANGED_ATTACK, MOVE, MOVE, MOVE, MOVE, HEAL], sizeLimit: Infinity, diff --git a/src/overlords/defense/distraction.ts b/src/overlords/defense/distraction.ts new file mode 100644 index 000000000..171646d42 --- /dev/null +++ b/src/overlords/defense/distraction.ts @@ -0,0 +1,55 @@ +import {CreepSetup} from '../../creepSetups/CreepSetup'; +import {CombatSetups, Roles} from '../../creepSetups/setups'; +import {DirectiveInvasionDefense} from '../../directives/defense/invasionDefense'; +import {CombatIntel} from '../../intel/CombatIntel'; +import {OverlordPriority} from '../../priorities/priorities_overlords'; +import {profile} from '../../profiler/decorator'; +import {boostResources} from '../../resources/map_resources'; +import {CombatZerg} from '../../zerg/CombatZerg'; +import {CombatOverlord} from '../CombatOverlord'; + +/** + * 5 Move 1 RA creep that avoids all enemies and distracts attackers. + * Just for fun + * TODO: Make them prefer swamps when at max hp + */ +@profile +export class DistractionOverlord extends CombatOverlord { + + distraction: CombatZerg[]; + room: Room; + + static settings = { + retreatHitsPercent : 0.85, + reengageHitsPercent: 0.95, + }; + + constructor(directive: DirectiveInvasionDefense, + boosted = false, + priority = OverlordPriority.defense.rangedDefense) { + super(directive, 'distraction', priority, 1); + this.distraction = this.combatZerg(Roles.ranged); + } + + private handleDistraction(distraction: CombatZerg): void { + if (this.room.hostiles.length > 0) { + distraction.autoCombat(this.room.name, false, 5); + this.taunt(distraction, this.room.hostiles[0].owner.username); + } + } + + taunt(distraction: CombatZerg, name?: string) { + const taunts: string[] = ['Heylisten!', 'Pssssst', 'Catch Me!', `Hi ${name || ''}`, '🍑🍑🍑', '🏎️ VROOM']; + distraction.sayRandom(taunts, true); + } + + init() { + this.reassignIdleCreeps(Roles.ranged); + const setup = CombatSetups.hydralisks.distraction; + this.wishlist(1, setup); + } + + run() { + this.autoRun(this.distraction, distraction => this.handleDistraction(distraction)); + } +} diff --git a/src/zerg/CombatZerg.ts b/src/zerg/CombatZerg.ts index 567219dfc..92f3b4786 100644 --- a/src/zerg/CombatZerg.ts +++ b/src/zerg/CombatZerg.ts @@ -227,7 +227,7 @@ export class CombatZerg extends Zerg { /** * Navigate to a room, then engage hostile creeps there, perform medic actions, etc. */ - autoCombat(roomName: string, verbose = false) { + autoCombat(roomName: string, verbose = false, preferredRange?: number) { // Do standard melee, ranged, and heal actions if (this.getActiveBodyparts(ATTACK) > 0) { @@ -255,7 +255,7 @@ export class CombatZerg extends Zerg { // Fight within the room const target = CombatTargeting.findTarget(this); const preferRanged = this.getActiveBodyparts(RANGED_ATTACK) > this.getActiveBodyparts(ATTACK); - const targetRange = preferRanged ? 3 : 1; + const targetRange = preferredRange || preferRanged ? 3 : 1; this.debug(`${target}, ${targetRange}`); if (target) { const avoid = []; @@ -263,10 +263,10 @@ export class CombatZerg extends Zerg { if (preferRanged) { const meleeHostiles = _.filter(this.room.hostiles, h => CombatIntel.getAttackDamage(h) > 0); for (const hostile of meleeHostiles) { - avoid.push({pos: hostile.pos, range: 2}); + avoid.push({pos: hostile.pos, range: targetRange - 1}); } } - return Movement.combatMove(this, [{pos: target.pos, range: targetRange}], []); + return Movement.combatMove(this, [{pos: target.pos, range: targetRange}], avoid); } } From 0f7a554bdcdcbe79476c235abb73bd39ecac41e1 Mon Sep 17 00:00:00 2001 From: Matthew Roy Date: Thu, 13 Jun 2019 15:34:38 -0700 Subject: [PATCH 2/4] Distraction updates --- src/overlords/defense/distraction.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/overlords/defense/distraction.ts b/src/overlords/defense/distraction.ts index 171646d42..702fdaefc 100644 --- a/src/overlords/defense/distraction.ts +++ b/src/overlords/defense/distraction.ts @@ -16,7 +16,7 @@ import {CombatOverlord} from '../CombatOverlord'; @profile export class DistractionOverlord extends CombatOverlord { - distraction: CombatZerg[]; + distractions: CombatZerg[]; room: Room; static settings = { @@ -28,18 +28,24 @@ export class DistractionOverlord extends CombatOverlord { boosted = false, priority = OverlordPriority.defense.rangedDefense) { super(directive, 'distraction', priority, 1); - this.distraction = this.combatZerg(Roles.ranged); + this.distractions = this.combatZerg(Roles.ranged); } private handleDistraction(distraction: CombatZerg): void { if (this.room.hostiles.length > 0) { - distraction.autoCombat(this.room.name, false, 5); + distraction.autoCombat(this.room.name, false, 5, {preferRamparts: false}); this.taunt(distraction, this.room.hostiles[0].owner.username); + const nearbyHostiles = this.room.hostiles.filter(hostile => hostile.pos.getRangeTo(distraction) <= 6); + //nearbyHostiles[0] + if (nearbyHostiles.length > 0) { + distraction.kite(nearbyHostiles); + } } } taunt(distraction: CombatZerg, name?: string) { - const taunts: string[] = ['Heylisten!', 'Pssssst', 'Catch Me!', `Hi ${name || ''}`, '🍑🍑🍑', '🏎️ VROOM']; + const taunts: string[] = ['Heylisten!', 'Pssssst', 'So close', '🎣', 'Try harder', 'Get good;)', 'Base ⬆️', '🔜', + '⚠️Swamp⚠️', 'Follow me!', 'Catch Me!', `Hi ${name || ''}`, '🍑🍑🍑', '🏎️ VROOM']; distraction.sayRandom(taunts, true); } @@ -50,6 +56,7 @@ export class DistractionOverlord extends CombatOverlord { } run() { - this.autoRun(this.distraction, distraction => this.handleDistraction(distraction)); + console.log(`Distraction overlord running in ${this.room.print} with ${this.distractions}!`); + this.autoRun(this.distractions, distraction => this.handleDistraction(distraction)); } } From b8254c8b3797035df37a05555d9cebfc0ba43aa1 Mon Sep 17 00:00:00 2001 From: Matthew Roy Date: Thu, 13 Jun 2019 18:40:48 -0700 Subject: [PATCH 3/4] Updating distraction and lint --- src/overlords/defense/distraction.ts | 3 +-- src/zerg/CombatZerg.ts | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/overlords/defense/distraction.ts b/src/overlords/defense/distraction.ts index 702fdaefc..f0b032213 100644 --- a/src/overlords/defense/distraction.ts +++ b/src/overlords/defense/distraction.ts @@ -36,14 +36,13 @@ export class DistractionOverlord extends CombatOverlord { distraction.autoCombat(this.room.name, false, 5, {preferRamparts: false}); this.taunt(distraction, this.room.hostiles[0].owner.username); const nearbyHostiles = this.room.hostiles.filter(hostile => hostile.pos.getRangeTo(distraction) <= 6); - //nearbyHostiles[0] if (nearbyHostiles.length > 0) { distraction.kite(nearbyHostiles); } } } - taunt(distraction: CombatZerg, name?: string) { + static taunt(distraction: CombatZerg, name?: string) { const taunts: string[] = ['Heylisten!', 'Pssssst', 'So close', '🎣', 'Try harder', 'Get good;)', 'Base ⬆️', '🔜', '⚠️Swamp⚠️', 'Follow me!', 'Catch Me!', `Hi ${name || ''}`, '🍑🍑🍑', '🏎️ VROOM']; distraction.sayRandom(taunts, true); diff --git a/src/zerg/CombatZerg.ts b/src/zerg/CombatZerg.ts index 92f3b4786..12067059d 100644 --- a/src/zerg/CombatZerg.ts +++ b/src/zerg/CombatZerg.ts @@ -1,5 +1,5 @@ import {CombatIntel} from '../intel/CombatIntel'; -import {Movement, NO_ACTION} from '../movement/Movement'; +import {CombatMoveOptions, Movement, MoveOptions, NO_ACTION} from '../movement/Movement'; import {profile} from '../profiler/decorator'; import {CombatTargeting} from '../targeting/CombatTargeting'; import {GoalFinder} from '../targeting/GoalFinder'; @@ -227,7 +227,7 @@ export class CombatZerg extends Zerg { /** * Navigate to a room, then engage hostile creeps there, perform medic actions, etc. */ - autoCombat(roomName: string, verbose = false, preferredRange?: number) { + autoCombat(roomName: string, verbose = false, preferredRange?: number, options?: CombatMoveOptions) { // Do standard melee, ranged, and heal actions if (this.getActiveBodyparts(ATTACK) > 0) { @@ -266,7 +266,7 @@ export class CombatZerg extends Zerg { avoid.push({pos: hostile.pos, range: targetRange - 1}); } } - return Movement.combatMove(this, [{pos: target.pos, range: targetRange}], avoid); + return Movement.combatMove(this, [{pos: target.pos, range: targetRange}], avoid, options); } } From c6776b639de8174c6c59d0aa002bf934dfe7eb6e Mon Sep 17 00:00:00 2001 From: Matthew Roy Date: Fri, 14 Jun 2019 15:41:54 -0700 Subject: [PATCH 4/4] Adding botarena spawning --- src/directives/defense/invasionDefense.ts | 6 ++++++ src/overlords/defense/distraction.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/directives/defense/invasionDefense.ts b/src/directives/defense/invasionDefense.ts index 1d6cab663..d7346d649 100644 --- a/src/directives/defense/invasionDefense.ts +++ b/src/directives/defense/invasionDefense.ts @@ -1,5 +1,6 @@ import {ColonyStage} from '../../Colony'; import {CombatIntel} from '../../intel/CombatIntel'; +import {DistractionOverlord} from '../../overlords/defense/distraction'; import {MeleeDefenseOverlord} from '../../overlords/defense/meleeDefense'; import {RangedDefenseOverlord} from '../../overlords/defense/rangedDefense'; import {profile} from '../../profiler/decorator'; @@ -51,6 +52,11 @@ export class DirectiveInvasionDefense extends Directive { this.overlords.meleeDefense = new MeleeDefenseOverlord(this, useBoosts); } + // Secondary defense + if (this.colony.level > 4 && meleeHostiles.length > 1 && expectedDamage > (ATTACK_POWER * 20)) { + this.overlords.distraction = new DistractionOverlord(this); + } + } init(): void { diff --git a/src/overlords/defense/distraction.ts b/src/overlords/defense/distraction.ts index f0b032213..8bd10abf6 100644 --- a/src/overlords/defense/distraction.ts +++ b/src/overlords/defense/distraction.ts @@ -34,7 +34,7 @@ export class DistractionOverlord extends CombatOverlord { private handleDistraction(distraction: CombatZerg): void { if (this.room.hostiles.length > 0) { distraction.autoCombat(this.room.name, false, 5, {preferRamparts: false}); - this.taunt(distraction, this.room.hostiles[0].owner.username); + DistractionOverlord.taunt(distraction, this.room.hostiles[0].owner.username); const nearbyHostiles = this.room.hostiles.filter(hostile => hostile.pos.getRangeTo(distraction) <= 6); if (nearbyHostiles.length > 0) { distraction.kite(nearbyHostiles);