From 3c118341d39739b66ce6f182b650ccfd925b2449 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Tue, 26 May 2020 22:26:46 +0300 Subject: [PATCH] Improve ready task selection --- src/Core/HeroBalance.ts | 2 +- src/Core/Resources.ts | 10 ++++++++-- src/VillageTaskCollection.ts | 6 +++++- tests/Core/ResourcesTest.ts | 8 ++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Core/HeroBalance.ts b/src/Core/HeroBalance.ts index ca8c5f2..4f5400e 100644 --- a/src/Core/HeroBalance.ts +++ b/src/Core/HeroBalance.ts @@ -18,7 +18,7 @@ export function calcHeroResource(requirements: ReadonlyArray): HeroRe function getFirstRequirement(requirements: ReadonlyArray): Resources { for (let required of requirements) { - if (required.lt(Resources.zero())) { + if (required.anyLower(Resources.zero())) { return required; } } diff --git a/src/Core/Resources.ts b/src/Core/Resources.ts index ac8d1a9..4a3fcd3 100644 --- a/src/Core/Resources.ts +++ b/src/Core/Resources.ts @@ -85,14 +85,20 @@ export class Resources implements ResourcesInterface { ); } - lt(other: ResourcesInterface): boolean { + anyLower(other: ResourcesInterface): boolean { return this.lumber < other.lumber || this.clay < other.clay || this.iron < other.iron || this.crop < other.crop; } - gt(other: ResourcesInterface): boolean { + allGreater(other: ResourcesInterface): boolean { return this.lumber > other.lumber && this.clay > other.clay && this.iron > other.iron && this.crop > other.crop; } + allGreaterOrEqual(other: ResourcesInterface): boolean { + return ( + this.lumber >= other.lumber && this.clay >= other.clay && this.iron >= other.iron && this.crop >= other.crop + ); + } + min(other: ResourcesInterface): Resources { return new Resources( Math.min(this.lumber, other.lumber), diff --git a/src/VillageTaskCollection.ts b/src/VillageTaskCollection.ts index e760620..243ede1 100644 --- a/src/VillageTaskCollection.ts +++ b/src/VillageTaskCollection.ts @@ -83,7 +83,11 @@ export class VillageTaskCollection { return undefined; } - return _.first(firstReadyGroup.tasks); + const maxCapacity = Resources.fromStorage(this.storage.getResourceStorage()); + + return firstReadyGroup.tasks.find( + t => !t.args.resources || maxCapacity.allGreaterOrEqual(Resources.fromObject(t.args.resources)) + ); } postponeTask(taskId: TaskId, seconds: number) { diff --git a/tests/Core/ResourcesTest.ts b/tests/Core/ResourcesTest.ts index 7036ce5..e9d610e 100644 --- a/tests/Core/ResourcesTest.ts +++ b/tests/Core/ResourcesTest.ts @@ -7,25 +7,25 @@ describe('Resources', function() { it('Can compare with lt', function() { const x = new Resources(0, 0, 0, 0); const y = new Resources(5, 5, 5, 5); - expect(x.lt(y)).is.true; + expect(x.anyLower(y)).is.true; }); it('Can compare with lt (mixed)', function() { const x = new Resources(20, 20, 5, 20); const y = new Resources(10, 10, 10, 10); - expect(x.lt(y)).is.true; + expect(x.anyLower(y)).is.true; }); it('Can compare with gt', function() { const x = new Resources(5, 5, 5, 5); const y = new Resources(0, 0, 0, 0); - expect(x.gt(y)).is.true; + expect(x.allGreater(y)).is.true; }); it('Can compare with gt (mixed)', function() { const x = new Resources(30, 30, 10, 30); const y = new Resources(20, 20, 20, 20); - expect(x.gt(y)).is.false; + expect(x.allGreater(y)).is.false; }); it('Can up to 1', function() {