Refactoring

This commit is contained in:
Anton Vakhrushev 2020-06-28 16:29:46 +03:00
parent d2d076d034
commit e2f9840dc8
3 changed files with 26 additions and 61 deletions

View File

@ -30,7 +30,7 @@
<filling <filling
:value="villageState.resources.lumber" :value="villageState.resources.lumber"
:warning="villageState.storageOptimumFullness.lumber" :warning="villageState.storageOptimumFullness.lumber"
:critical="villageState.upperCriticalLevel.lumber" :critical="villageState.storageCriticalFullness.lumber"
:full="villageState.storage.capacity.lumber" :full="villageState.storage.capacity.lumber"
></filling> ></filling>
</td> </td>
@ -38,7 +38,7 @@
<filling <filling
:value="villageState.resources.clay" :value="villageState.resources.clay"
:warning="villageState.storageOptimumFullness.clay" :warning="villageState.storageOptimumFullness.clay"
:critical="villageState.upperCriticalLevel.clay" :critical="villageState.storageCriticalFullness.clay"
:full="villageState.storage.capacity.clay" :full="villageState.storage.capacity.clay"
></filling> ></filling>
</td> </td>
@ -46,7 +46,7 @@
<filling <filling
:value="villageState.resources.iron" :value="villageState.resources.iron"
:warning="villageState.storageOptimumFullness.iron" :warning="villageState.storageOptimumFullness.iron"
:critical="villageState.upperCriticalLevel.iron" :critical="villageState.storageCriticalFullness.iron"
:full="villageState.storage.capacity.iron" :full="villageState.storage.capacity.iron"
></filling> ></filling>
</td> </td>
@ -54,7 +54,7 @@
<filling <filling
:value="villageState.resources.crop" :value="villageState.resources.crop"
:warning="villageState.storageOptimumFullness.crop" :warning="villageState.storageOptimumFullness.crop"
:critical="villageState.upperCriticalLevel.crop" :critical="villageState.storageCriticalFullness.crop"
:full="villageState.storage.capacity.crop" :full="villageState.storage.capacity.crop"
></filling> ></filling>
</td> </td>

View File

@ -53,10 +53,6 @@ interface VillageProductionQueueState {
taskCount: number; taskCount: number;
} }
interface VillageProductionQueueStateDict {
[queue: string]: VillageProductionQueueState;
}
interface VillageOwnState { interface VillageOwnState {
/** /**
* Village id * Village id
@ -72,24 +68,16 @@ interface VillageOwnState {
resources: Resources; resources: Resources;
performance: Resources; performance: Resources;
storage: VillageStorageState; storage: VillageStorageState;
upperCriticalLevel: Resources;
storageOptimumFullness: Resources; storageOptimumFullness: Resources;
storageCriticalFullness: Resources;
isOverflowing: boolean; isOverflowing: boolean;
queues: VillageProductionQueueStateDict; queues: Array<VillageProductionQueueState>;
tasks: Array<Task>; tasks: Array<Task>;
firstReadyTask: Task | undefined; firstReadyTask: Task | undefined;
/** /**
* Required resources for nearest task * Required resources for nearest task
*/ */
required: ResourceLineState; required: ResourceLineState;
/**
* Required resources for first tasks in production queues
*/
frontierRequired: ResourceLineState;
/**
* Required resources for all tasks
*/
totalRequired: ResourceLineState;
incomingResources: Resources; incomingResources: Resources;
settings: VillageSettings; settings: VillageSettings;
} }
@ -105,7 +93,7 @@ export interface VillageState extends VillageOwnState {
commitments: Resources; commitments: Resources;
} }
function makeResourceBalance( function makeResourceState(
resources: Resources, resources: Resources,
current: Resources, current: Resources,
performance: Resources performance: Resources
@ -118,7 +106,7 @@ function makeResourceBalance(
}; };
} }
function makeStorageBalance( function makeStorageState(
resources: Resources, resources: Resources,
storage: Resources, storage: Resources,
performance: Resources performance: Resources
@ -185,8 +173,8 @@ function createProductionQueueState(
taskEndingTimestamp ? taskEndingTimestamp - currentTimestamp : 0, taskEndingTimestamp ? taskEndingTimestamp - currentTimestamp : 0,
0 0
), ),
firstTask: makeResourceBalance(firstTaskResources, resources, performance), firstTask: makeResourceState(firstTaskResources, resources, performance),
allTasks: makeResourceBalance(allTaskResources, resources, performance), allTasks: makeResourceState(allTaskResources, resources, performance),
taskCount: tasks.length, taskCount: tasks.length,
}; };
} }
@ -195,31 +183,30 @@ function createAllProductionQueueStates(
storage: VillageStorage, storage: VillageStorage,
taskCollection: VillageTaskCollection taskCollection: VillageTaskCollection
) { ) {
let result: VillageProductionQueueStateDict = {}; let result: Array<VillageProductionQueueState> = [];
for (let taskQueueInfo of taskCollection.getGroupedByQueueTasks()) { for (let taskQueueInfo of taskCollection.getGroupedByQueueTasks()) {
result[taskQueueInfo.queue] = createProductionQueueState(taskQueueInfo, storage); result.push(createProductionQueueState(taskQueueInfo, storage));
} }
return result; return result;
} }
function getReadyForProductionTask( function getReadyForProductionTask(
queues: VillageProductionQueueStateDict, queues: ReadonlyArray<VillageProductionQueueState>,
maxResourcesForTask: Resources maxResourcesForTask: Resources
): Task | undefined { ): Task | undefined {
const firstReadyGroup = Object.values(queues).find(group => group.isWaiting); const firstReadyQueue = queues.find(queue => queue.isWaiting);
if (!firstReadyGroup) { if (!firstReadyQueue) {
return undefined; return undefined;
} }
return firstReadyGroup.tasks.find( return firstReadyQueue.tasks.find(
t => task =>
t.name === TrainTroopTask.name || task.name === TrainTroopTask.name ||
!t.args.resources || maxResourcesForTask.allGreaterOrEqual(getTaskResources(task))
maxResourcesForTask.allGreaterOrEqual(Resources.fromObject(t.args.resources))
); );
} }
function getReadyTaskRequiredResources(task: Task | undefined): Resources { function getTaskResources(task: Task | undefined): Resources {
if (task && task.args.resources) { if (task && task.args.resources) {
return Resources.fromObject(task.args.resources); return Resources.fromObject(task.args.resources);
} }
@ -235,30 +222,26 @@ function createVillageOwnState(
const resources = storage.getResources(); const resources = storage.getResources();
const storageResources = Resources.fromStorage(storage.getResourceStorage()); const storageResources = Resources.fromStorage(storage.getResourceStorage());
const performance = storage.getResourcesPerformance(); const performance = storage.getResourcesPerformance();
const upperCriticalLevel = storageResources.sub(performance.scale(1));
const storageOptimumFullness = storageResources.sub(performance.scale(3)); const storageOptimumFullness = storageResources.sub(performance.scale(3));
const isOverflowing = upperCriticalLevel.anyLower(resources); const storageCriticalFullness = storageResources.sub(performance.scale(1));
const isOverflowing = storageCriticalFullness.anyLower(resources);
const queues = createAllProductionQueueStates(storage, taskCollection); const queues = createAllProductionQueueStates(storage, taskCollection);
const firstReadyTask = getReadyForProductionTask(queues, storageOptimumFullness); const firstReadyTask = getReadyForProductionTask(queues, storageOptimumFullness);
const requiredResources = getReadyTaskRequiredResources(firstReadyTask); const requiredResources = getTaskResources(firstReadyTask);
const frontierResources = taskCollection.getFrontierTaskResources();
const totalRequiredResources = taskCollection.getAllTasksResources();
return { return {
id: village.id, id: village.id,
village, village,
resources, resources,
performance, performance,
storage: makeStorageBalance(resources, storageResources, performance), storage: makeStorageState(resources, storageResources, performance),
required: makeResourceBalance(requiredResources, resources, performance), required: makeResourceState(requiredResources, resources, performance),
upperCriticalLevel,
storageOptimumFullness, storageOptimumFullness,
storageCriticalFullness,
isOverflowing, isOverflowing,
queues, queues,
tasks: taskCollection.getTasks(), tasks: taskCollection.getTasks(),
firstReadyTask, firstReadyTask,
frontierRequired: makeResourceBalance(frontierResources, resources, performance),
totalRequired: makeResourceBalance(totalRequiredResources, resources, performance),
incomingResources: calcIncomingResources(storage), incomingResources: calcIncomingResources(storage),
settings, settings,
}; };

View File

@ -7,7 +7,6 @@ import { Resources } from './Core/Resources';
import { ContractAttributes, ContractType } from './Core/Contract'; 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';
import * as _ from 'underscore';
export interface QueueTasks { export interface QueueTasks {
queue: ProductionQueue; queue: ProductionQueue;
@ -114,21 +113,4 @@ export class VillageTaskCollection {
} }
return result; return result;
} }
getFrontierTaskResources(): Resources {
let result = Resources.zero();
const groups = this.getGroupedByQueueTasks();
for (let group of groups) {
const firstTask = _.first(group.tasks);
if (firstTask && firstTask.args.resources) {
result = result.add(Resources.fromObject(firstTask.args.resources));
}
}
return result;
}
getAllTasksResources(): Resources {
const tasks = this.storage.getTasks().filter(t => t.args.resources);
return tasks.reduce((acc, t) => acc.add(t.args.resources!), Resources.zero());
}
} }