Change task production order
This commit is contained in:
parent
b99bbd94a6
commit
09e989a8a1
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user