diff --git a/src/Queue/TaskProvider.ts b/src/Queue/TaskProvider.ts index b5aaecd..551e43c 100644 --- a/src/Queue/TaskProvider.ts +++ b/src/Queue/TaskProvider.ts @@ -1,6 +1,8 @@ import { Args } from './Args'; import { uniqId } from '../utils'; import { ResourcesInterface } from '../Core/Resources'; +import { ProductionQueue } from '../Core/ProductionQueue'; +import { getProductionQueue } from '../Task/TaskMap'; export type TaskId = string; @@ -40,10 +42,18 @@ export interface TaskProvider { setTasks(tasks: TaskList): void; } +export interface TaskMatcher { + (task: Task): boolean; +} + export interface TaskTransformer { (task: Task): Task; } +export function isInQueue(queue: ProductionQueue): TaskMatcher { + return (task: Task) => getProductionQueue(task.name) === queue; +} + export function withTime(ts: number): TaskTransformer { return (task: Task) => new Task(task.id, ts, task.name, task.args); } diff --git a/src/VillageController.ts b/src/VillageController.ts index 62d0d34..a0296d3 100644 --- a/src/VillageController.ts +++ b/src/VillageController.ts @@ -22,7 +22,7 @@ export class VillageController { } getReadyProductionTask(): Task | undefined { - return this.taskCollection.getReadyProductionTask(); + return this.taskCollection.getReadyForProductionTask(); } addTask(name: string, args: Args) { diff --git a/src/VillageTaskCollection.ts b/src/VillageTaskCollection.ts index df5b6d9..3ec4c17 100644 --- a/src/VillageTaskCollection.ts +++ b/src/VillageTaskCollection.ts @@ -1,13 +1,13 @@ import { VillageStorage } from './Storage/VillageStorage'; -import { Task, TaskId, uniqTaskId, withResources, withTime } from './Queue/TaskProvider'; +import { isInQueue, Task, TaskId, uniqTaskId, withResources, withTime } from './Queue/TaskProvider'; import { Args } from './Queue/Args'; -import { isProductionTask, ProductionQueue, OrderedProductionQueues } from './Core/ProductionQueue'; -import { getProductionQueue } from './Task/TaskMap'; +import { isProductionTask, OrderedProductionQueues, ProductionQueue } from './Core/ProductionQueue'; import { timestamp } from './utils'; import { Resources } from './Core/Resources'; import { ContractAttributes, ContractType } from './Core/Contract'; import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask'; import { ForgeImprovementTask } from './Task/ForgeImprovementTask'; +import * as _ from 'underscore'; interface QueueTasks { queue: ProductionQueue; @@ -62,10 +62,9 @@ export class VillageTaskCollection { const tasks = this.storage.getTasks(); const result: Array = []; for (let queue of OrderedProductionQueues) { - const queueTasks = tasks.filter(task => getProductionQueue(task.name) === queue); result.push({ queue, - tasks: queueTasks, + tasks: tasks.filter(isInQueue(queue)), finishTs: this.storage.getQueueTaskEnding(queue), }); } @@ -73,16 +72,18 @@ export class VillageTaskCollection { } getTasksInProductionQueue(queue: ProductionQueue): Array { - return this.storage.getTasks().filter(task => getProductionQueue(task.name) === queue); + return this.storage.getTasks().filter(isInQueue(queue)); } - getReadyProductionTask(): Task | undefined { + getReadyForProductionTask(): Task | undefined { const groups = this.getQueueGroupedTasks(); - const firstReadyGroup = groups.filter(g => g.finishTs <= timestamp()).shift(); + const nowTs = timestamp(); + const firstReadyGroup = groups.find(g => g.finishTs <= nowTs && g.tasks.length !== 0); if (!firstReadyGroup) { return undefined; } - return firstReadyGroup.tasks.shift(); + + return _.first(firstReadyGroup.tasks); } postponeTask(taskId: TaskId, seconds: number) { @@ -105,7 +106,7 @@ export class VillageTaskCollection { } getVillageRequiredResources(): Resources { - const first = this.getReadyProductionTask(); + const first = this.getReadyForProductionTask(); if (first && first.args.resources) { return Resources.fromObject(first.args.resources); }