From 74e8340cc073905558c3ad04be2b7c7c1ba9694b Mon Sep 17 00:00:00 2001
From: Anton Vakhrushev <anwinged@ya.ru>
Date: Tue, 21 Jul 2020 11:17:19 +0300
Subject: [PATCH] Add harvester source selection

---
 src/{ => creep}/builder.ts   |  2 +-
 src/creep/common.ts          | 22 ++++++++++++++++++++++
 src/{ => creep}/harvester.ts | 20 +++++++++++++++++---
 src/{ => creep}/upgrader.ts  |  2 +-
 src/main.ts                  |  6 +++---
 5 files changed, 44 insertions(+), 8 deletions(-)
 rename src/{ => creep}/builder.ts (96%)
 create mode 100644 src/creep/common.ts
 rename src/{ => creep}/harvester.ts (61%)
 rename src/{ => creep}/upgrader.ts (95%)

diff --git a/src/builder.ts b/src/creep/builder.ts
similarity index 96%
rename from src/builder.ts
rename to src/creep/builder.ts
index dc3a681..84ba569 100644
--- a/src/builder.ts
+++ b/src/creep/builder.ts
@@ -1,4 +1,4 @@
-import { randomIntInRange } from './utils/Random';
+import { randomIntInRange } from '../utils/Random';
 
 interface BuilderMemory extends CreepMemory {
   building: boolean | undefined;
diff --git a/src/creep/common.ts b/src/creep/common.ts
new file mode 100644
index 0000000..50d01fc
--- /dev/null
+++ b/src/creep/common.ts
@@ -0,0 +1,22 @@
+import { randomIntInRange } from '../utils/Random';
+
+export interface SourceNumber {
+  sourceNum: number | undefined;
+}
+
+function selectSource(memory: SourceNumber) {
+  if (memory.sourceNum === undefined) {
+    const sources = creep.room.find(FIND_SOURCES);
+    memory.sourceNum = randomIntInRange(0, sources.length);
+  }
+}
+
+function moveToSource(creep: Creep) {
+  const memory = creep.memory as SourceNumber;
+  const sources = creep.room.find(FIND_SOURCES);
+  const sourceNum = memory.sourceNum;
+  if (creep.harvest(sources[sourceNum]) == ERR_NOT_IN_RANGE) {
+    creep.say('🔄 harvest ' + sourceNum);
+    creep.moveTo(sources[sourceNum], { visualizePathStyle: { stroke: '#ffaa00' } });
+  }
+}
diff --git a/src/harvester.ts b/src/creep/harvester.ts
similarity index 61%
rename from src/harvester.ts
rename to src/creep/harvester.ts
index 4a0c568..0ddf9f6 100644
--- a/src/harvester.ts
+++ b/src/creep/harvester.ts
@@ -1,9 +1,23 @@
+import { randomIntInRange } from '../utils/Random';
+
+interface HarvesterMemory extends CreepMemory {
+  sourceNum: number | undefined;
+}
+
 export function runAsHarvester(creep: Creep) {
+  const memory = creep.memory as HarvesterMemory;
+
+  if (memory.sourceNum === undefined) {
+    const sources = creep.room.find(FIND_SOURCES);
+    memory.sourceNum = randomIntInRange(0, sources.length);
+  }
+
   if (creep.store.getFreeCapacity() > 0) {
     let sources = creep.room.find(FIND_SOURCES);
-    if (creep.harvest(sources[0]) === ERR_NOT_IN_RANGE) {
-      creep.say('to source');
-      creep.moveTo(sources[0], { visualizePathStyle: { stroke: '#ffaa00' } });
+    const sourceNum = memory.sourceNum;
+    if (creep.harvest(sources[sourceNum]) === ERR_NOT_IN_RANGE) {
+      creep.say('To source ' + sourceNum);
+      creep.moveTo(sources[sourceNum], { visualizePathStyle: { stroke: '#ffaa00' } });
     }
   } else {
     let targets = creep.room.find(FIND_STRUCTURES, {
diff --git a/src/upgrader.ts b/src/creep/upgrader.ts
similarity index 95%
rename from src/upgrader.ts
rename to src/creep/upgrader.ts
index 20485bb..80eff48 100644
--- a/src/upgrader.ts
+++ b/src/creep/upgrader.ts
@@ -1,4 +1,4 @@
-import { randomIntInRange } from './utils/Random';
+import { randomIntInRange } from '../utils/Random';
 
 interface UpgraderMemory extends CreepMemory {
   upgrading: boolean | undefined;
diff --git a/src/main.ts b/src/main.ts
index 243be50..63c8a30 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,7 +1,7 @@
 import { ErrorMapper } from 'utils/ErrorMapper';
-import { runAsHarvester } from './harvester';
-import { runAsBuilder } from './builder';
-import { runAsUpgrader } from './upgrader';
+import { runAsHarvester } from './creep/harvester';
+import { runAsBuilder } from './creep/builder';
+import { runAsUpgrader } from './creep/upgrader';
 import { uniqId } from './utils/Identity';
 
 function makeName(role: string): string {