Change task production order

This commit is contained in:
Anton Vakhrushev 2020-05-26 09:41:16 +03:00
parent b99bbd94a6
commit 09e989a8a1
3 changed files with 32 additions and 13 deletions

View File

@ -10,7 +10,7 @@ export enum ProductionQueue {
/** /**
* Placed in order of execution priority. Order is important! * Placed in order of execution priority. Order is important!
*/ */
export const ProductionQueueTypes: ReadonlyArray<ProductionQueue> = [ export const OrderedProductionQueues: ReadonlyArray<ProductionQueue> = [
ProductionQueue.TrainUnit, ProductionQueue.TrainUnit,
ProductionQueue.Celebration, ProductionQueue.Celebration,
ProductionQueue.UpgradeUnit, ProductionQueue.UpgradeUnit,
@ -37,7 +37,7 @@ export interface TaskNamePredicate {
/** /**
* List on non intersected task queue predicates. * List on non intersected task queue predicates.
*/ */
export const TASK_TYPE_PREDICATES: Array<TaskNamePredicate> = ProductionQueueTypes.map(queue => { const TASK_TYPE_PREDICATES: Array<TaskNamePredicate> = OrderedProductionQueues.map(queue => {
return (taskName: string) => getProductionQueue(taskName) === queue; return (taskName: string) => getProductionQueue(taskName) === queue;
}); });

View File

@ -4,7 +4,7 @@ import { VillageStorage } from './Storage/VillageStorage';
import { calcGatheringTimings, GatheringTime } from './Core/GatheringTimings'; import { calcGatheringTimings, GatheringTime } from './Core/GatheringTimings';
import { VillageRepositoryInterface } from './VillageRepository'; import { VillageRepositoryInterface } from './VillageRepository';
import { VillageNotFound } from './Errors'; import { VillageNotFound } from './Errors';
import { ProductionQueue, ProductionQueueTypes } from './Core/ProductionQueue'; import { ProductionQueue, OrderedProductionQueues } from './Core/ProductionQueue';
import { Task } from './Queue/TaskProvider'; import { Task } from './Queue/TaskProvider';
import { timestamp } from './utils'; import { timestamp } from './utils';
import { VillageTaskCollection } from './VillageTaskCollection'; import { VillageTaskCollection } from './VillageTaskCollection';
@ -157,7 +157,7 @@ function createProductionQueueState(
function createAllProductionQueueStates(storage: VillageStorage, taskCollection: VillageTaskCollection) { function createAllProductionQueueStates(storage: VillageStorage, taskCollection: VillageTaskCollection) {
let result: { [queue: string]: VillageProductionQueueState } = {}; let result: { [queue: string]: VillageProductionQueueState } = {};
for (let queue of ProductionQueueTypes) { for (let queue of OrderedProductionQueues) {
result[queue] = createProductionQueueState(queue, storage, taskCollection); result[queue] = createProductionQueueState(queue, storage, taskCollection);
} }
return result; return result;
@ -165,7 +165,7 @@ function createAllProductionQueueStates(storage: VillageStorage, taskCollection:
function calcFrontierResources(taskCollection: VillageTaskCollection): Resources { function calcFrontierResources(taskCollection: VillageTaskCollection): Resources {
let result = Resources.zero(); let result = Resources.zero();
for (let queue of ProductionQueueTypes) { for (let queue of OrderedProductionQueues) {
const tasks = taskCollection.getTasksInProductionQueue(queue); const tasks = taskCollection.getTasksInProductionQueue(queue);
const firstTaskResources = tasks.slice(0, 1).reduce(taskResourceReducer, Resources.zero()); const firstTaskResources = tasks.slice(0, 1).reduce(taskResourceReducer, Resources.zero());
result = result.add(firstTaskResources); result = result.add(firstTaskResources);

View File

@ -1,7 +1,7 @@
import { VillageStorage } from './Storage/VillageStorage'; import { VillageStorage } from './Storage/VillageStorage';
import { Task, TaskId, uniqTaskId, withResources, withTime } from './Queue/TaskProvider'; import { Task, TaskId, uniqTaskId, withResources, withTime } from './Queue/TaskProvider';
import { Args } from './Queue/Args'; 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 { getProductionQueue } from './Task/TaskMap';
import { timestamp } from './utils'; import { timestamp } from './utils';
import { Resources } from './Core/Resources'; import { Resources } from './Core/Resources';
@ -9,6 +9,12 @@ import { ContractAttributes, ContractType } from './Core/Contract';
import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask'; import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask';
import { ForgeImprovementTask } from './Task/ForgeImprovementTask'; import { ForgeImprovementTask } from './Task/ForgeImprovementTask';
interface QueueTasks {
queue: ProductionQueue;
tasks: Array<Task>;
finishTs: number;
}
export class VillageTaskCollection { export class VillageTaskCollection {
private readonly storage: VillageStorage; private readonly storage: VillageStorage;
private readonly villageId: number; private readonly villageId: number;
@ -52,17 +58,31 @@ export class VillageTaskCollection {
this.removeTasks(t => t.id === taskId); this.removeTasks(t => t.id === taskId);
} }
private getQueueGroupedTasks(): Array<QueueTasks> {
const tasks = this.storage.getTasks();
const result: Array<QueueTasks> = [];
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<Task> { getTasksInProductionQueue(queue: ProductionQueue): Array<Task> {
return this.storage.getTasks().filter(task => getProductionQueue(task.name) === queue); return this.storage.getTasks().filter(task => getProductionQueue(task.name) === queue);
} }
getReadyProductionTask(): Task | undefined { getReadyProductionTask(): Task | undefined {
let sortedTasks: Array<Task> = []; const groups = this.getQueueGroupedTasks();
for (let queue of ProductionQueueTypes) { const firstReadyGroup = groups.filter(g => g.finishTs <= timestamp()).shift();
const tasks = this.getTasksInProductionQueue(queue); if (!firstReadyGroup) {
sortedTasks = sortedTasks.concat(tasks); return undefined;
} }
return sortedTasks.shift(); return firstReadyGroup.tasks.shift();
} }
postponeTask(taskId: TaskId, seconds: number) { postponeTask(taskId: TaskId, seconds: number) {
@ -85,8 +105,7 @@ export class VillageTaskCollection {
} }
getVillageRequiredResources(): Resources { getVillageRequiredResources(): Resources {
const tasks = this.storage.getTasks().filter(t => t.args.resources); const first = this.getReadyProductionTask();
const first = tasks.shift();
if (first && first.args.resources) { if (first && first.args.resources) {
return Resources.fromObject(first.args.resources); return Resources.fromObject(first.args.resources);
} }