From 09e989a8a17022e43c52b58cf23d53106cc06c90 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Tue, 26 May 2020 09:41:16 +0300 Subject: [PATCH] Change task production order --- src/Core/ProductionQueue.ts | 4 ++-- src/VillageState.ts | 6 +++--- src/VillageTaskCollection.ts | 35 +++++++++++++++++++++++++++-------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/Core/ProductionQueue.ts b/src/Core/ProductionQueue.ts index 6352a6b..7e1003c 100644 --- a/src/Core/ProductionQueue.ts +++ b/src/Core/ProductionQueue.ts @@ -10,7 +10,7 @@ export enum ProductionQueue { /** * Placed in order of execution priority. Order is important! */ -export const ProductionQueueTypes: ReadonlyArray = [ +export const OrderedProductionQueues: ReadonlyArray = [ ProductionQueue.TrainUnit, ProductionQueue.Celebration, ProductionQueue.UpgradeUnit, @@ -37,7 +37,7 @@ export interface TaskNamePredicate { /** * List on non intersected task queue predicates. */ -export const TASK_TYPE_PREDICATES: Array = ProductionQueueTypes.map(queue => { +const TASK_TYPE_PREDICATES: Array = OrderedProductionQueues.map(queue => { return (taskName: string) => getProductionQueue(taskName) === queue; }); diff --git a/src/VillageState.ts b/src/VillageState.ts index c3c282e..f84e073 100644 --- a/src/VillageState.ts +++ b/src/VillageState.ts @@ -4,7 +4,7 @@ import { VillageStorage } from './Storage/VillageStorage'; import { calcGatheringTimings, GatheringTime } from './Core/GatheringTimings'; import { VillageRepositoryInterface } from './VillageRepository'; import { VillageNotFound } from './Errors'; -import { ProductionQueue, ProductionQueueTypes } from './Core/ProductionQueue'; +import { ProductionQueue, OrderedProductionQueues } from './Core/ProductionQueue'; import { Task } from './Queue/TaskProvider'; import { timestamp } from './utils'; import { VillageTaskCollection } from './VillageTaskCollection'; @@ -157,7 +157,7 @@ function createProductionQueueState( function createAllProductionQueueStates(storage: VillageStorage, taskCollection: VillageTaskCollection) { let result: { [queue: string]: VillageProductionQueueState } = {}; - for (let queue of ProductionQueueTypes) { + for (let queue of OrderedProductionQueues) { result[queue] = createProductionQueueState(queue, storage, taskCollection); } return result; @@ -165,7 +165,7 @@ function createAllProductionQueueStates(storage: VillageStorage, taskCollection: function calcFrontierResources(taskCollection: VillageTaskCollection): Resources { let result = Resources.zero(); - for (let queue of ProductionQueueTypes) { + for (let queue of OrderedProductionQueues) { const tasks = taskCollection.getTasksInProductionQueue(queue); const firstTaskResources = tasks.slice(0, 1).reduce(taskResourceReducer, Resources.zero()); result = result.add(firstTaskResources); diff --git a/src/VillageTaskCollection.ts b/src/VillageTaskCollection.ts index 289c184..df5b6d9 100644 --- a/src/VillageTaskCollection.ts +++ b/src/VillageTaskCollection.ts @@ -1,7 +1,7 @@ import { VillageStorage } from './Storage/VillageStorage'; import { Task, TaskId, uniqTaskId, withResources, withTime } from './Queue/TaskProvider'; import { Args } from './Queue/Args'; -import { isProductionTask, ProductionQueue, ProductionQueueTypes } from './Core/ProductionQueue'; +import { isProductionTask, ProductionQueue, OrderedProductionQueues } from './Core/ProductionQueue'; import { getProductionQueue } from './Task/TaskMap'; import { timestamp } from './utils'; import { Resources } from './Core/Resources'; @@ -9,6 +9,12 @@ import { ContractAttributes, ContractType } from './Core/Contract'; import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask'; import { ForgeImprovementTask } from './Task/ForgeImprovementTask'; +interface QueueTasks { + queue: ProductionQueue; + tasks: Array; + finishTs: number; +} + export class VillageTaskCollection { private readonly storage: VillageStorage; private readonly villageId: number; @@ -52,17 +58,31 @@ export class VillageTaskCollection { this.removeTasks(t => t.id === taskId); } + private getQueueGroupedTasks(): Array { + 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, + finishTs: this.storage.getQueueTaskEnding(queue), + }); + } + return result; + } + getTasksInProductionQueue(queue: ProductionQueue): Array { return this.storage.getTasks().filter(task => getProductionQueue(task.name) === queue); } getReadyProductionTask(): Task | undefined { - let sortedTasks: Array = []; - for (let queue of ProductionQueueTypes) { - const tasks = this.getTasksInProductionQueue(queue); - sortedTasks = sortedTasks.concat(tasks); + const groups = this.getQueueGroupedTasks(); + const firstReadyGroup = groups.filter(g => g.finishTs <= timestamp()).shift(); + if (!firstReadyGroup) { + return undefined; } - return sortedTasks.shift(); + return firstReadyGroup.tasks.shift(); } postponeTask(taskId: TaskId, seconds: number) { @@ -85,8 +105,7 @@ export class VillageTaskCollection { } getVillageRequiredResources(): Resources { - const tasks = this.storage.getTasks().filter(t => t.args.resources); - const first = tasks.shift(); + const first = this.getReadyProductionTask(); if (first && first.args.resources) { return Resources.fromObject(first.args.resources); }