Refactoring
This commit is contained in:
parent
d2d076d034
commit
e2f9840dc8
@ -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>
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user