Add total required resources

This commit is contained in:
Anton Vakhrushev 2020-04-19 20:59:41 +03:00
parent d30dffb579
commit 61c41e6b03
5 changed files with 36 additions and 24 deletions

View File

@ -46,21 +46,11 @@ export class BalanceHeroResourcesAction extends ActionController {
console.log('REQUIRED', requiredResources);
if (requiredResources) {
return new Resources(
requiredResources.lumber - resources.lumber,
requiredResources.clay - resources.clay,
requiredResources.iron - resources.iron,
requiredResources.crop - resources.crop
);
return requiredResources.sub(resources);
}
const storage = grabResourceStorage();
return new Resources(
storage.warehouse - resources.lumber,
storage.warehouse - resources.clay,
storage.warehouse - resources.iron,
storage.granary - resources.crop
);
return Resources.fromStorage(storage).sub(resources);
}
}

View File

@ -14,7 +14,6 @@ import DashboardApp from './DashboardView/Dashboard.vue';
import { ResourcesToLevel } from './Task/ResourcesToLevel';
import { ConsoleLogger, Logger } from './Logger';
import { VillageState } from './State/VillageState';
import { StateGrabberManager } from './Grabber/StateGrabberManager';
interface QuickAction {
label: string;
@ -24,13 +23,11 @@ interface QuickAction {
export class ControlPanel {
private readonly version: string;
private readonly scheduler: Scheduler;
private grabbers: StateGrabberManager;
private readonly logger: Logger;
constructor(version: string, scheduler: Scheduler) {
this.version = version;
this.scheduler = scheduler;
this.grabbers = new StateGrabberManager();
this.logger = new ConsoleLogger(this.constructor.name);
}
@ -42,9 +39,6 @@ export class ControlPanel {
const villageId = grabActiveVillageId();
this.grabbers.grab();
setInterval(() => this.grabbers.grab(), 2000);
const scheduler = this.scheduler;
const quickActions: QuickAction[] = [];
@ -75,6 +69,7 @@ export class ControlPanel {
const performance = state.getResourcesPerformance();
const buildQueueInfo = state.getBuildingQueueInfo();
const requiredResources = scheduler.getVillageRequiredResources(village.id);
const totalRequiredResources = scheduler.getTotalVillageRequiredResources(village.id);
return {
id: village.id,
name: village.name,
@ -92,6 +87,10 @@ export class ControlPanel {
clay_need: requiredResources && requiredResources.clay,
iron_need: requiredResources && requiredResources.iron,
crop_need: requiredResources && requiredResources.crop,
lumber_total_need: totalRequiredResources.lumber,
clay_total_need: totalRequiredResources.clay,
iron_total_need: totalRequiredResources.iron,
crop_total_need: totalRequiredResources.crop,
warehouse: storage.warehouse,
granary: storage.granary,
buildRemainingSeconds: buildQueueInfo.seconds,

View File

@ -67,6 +67,23 @@
<td></td>
<td></td>
</tr>
<tr class="required-line">
<td class="right"></td>
<td class="right">
<resource :value="village.lumber - village.lumber_total_need"></resource>
</td>
<td class="right">
<resource :value="village.clay - village.clay_total_need"></resource>
</td>
<td class="right">
<resource :value="village.iron - village.iron_total_need"></resource>
</td>
<td class="right">
<resource :value="village.crop - village.crop_total_need"></resource>
</td>
<td></td>
<td></td>
</tr>
<tr class="performance-line">
<td class="right" v-text="secondsToTime(village.buildRemainingSeconds)"></td>
<td class="right">+{{ village.lumber_hour }}</td>

View File

@ -35,6 +35,7 @@ export class Resources implements ResourcesInterface {
readonly clay: number;
readonly iron: number;
readonly crop: number;
constructor(lumber: number, clay: number, iron: number, crop: number) {
this.lumber = lumber;
this.clay = clay;
@ -46,8 +47,8 @@ export class Resources implements ResourcesInterface {
return new Resources(obj.lumber, obj.clay, obj.iron, obj.crop);
}
static fromStorage(warehouse: number, granary: number): Resources {
return new Resources(warehouse, warehouse, warehouse, granary);
static fromStorage(storage: ResourceStorage): Resources {
return new Resources(storage.warehouse, storage.warehouse, storage.warehouse, storage.granary);
}
getByType(type: ResourceType): number {
@ -75,7 +76,7 @@ export class Resources implements ResourcesInterface {
return new Resources(this.lumber * n, this.clay * n, this.iron * n, this.crop * n);
}
add(other: Resources): Resources {
add(other: ResourcesInterface): Resources {
return new Resources(
this.lumber + other.lumber,
this.clay + other.clay,
@ -84,7 +85,7 @@ export class Resources implements ResourcesInterface {
);
}
sub(other: Resources): Resources {
sub(other: ResourcesInterface): Resources {
return new Resources(
this.lumber - other.lumber,
this.clay - other.clay,

View File

@ -121,15 +121,20 @@ export class Scheduler {
this.actionQueue.clear();
}
getVillageRequiredResources(villageId): ResourcesInterface | undefined {
getVillageRequiredResources(villageId): Resources | undefined {
const tasks = this.taskQueue.seeItems().filter(t => sameVillage(villageId, t.args) && t.args.resources);
const first = tasks.shift();
if (first && first.args.resources) {
return first.args.resources;
return Resources.fromObject(first.args.resources);
}
return undefined;
}
getTotalVillageRequiredResources(villageId): Resources {
const tasks = this.taskQueue.seeItems().filter(t => sameVillage(villageId, t.args) && t.args.resources);
return tasks.reduce((acc, t) => acc.add(t.args.resources!), new Resources(0, 0, 0, 0));
}
private reorderVillageTasks(villageId: number) {
const tasks = this.taskQueue.seeItems();
const trainPred = t => isTrainTroopTask(t.name) && sameVillage(villageId, t.args);