Add timings

This commit is contained in:
Anton Vakhrushev 2020-04-21 17:37:09 +03:00
parent 8d1b6cc13f
commit 217b653e5b
2 changed files with 145 additions and 50 deletions

View File

@ -14,6 +14,7 @@ import DashboardApp from './DashboardView/Dashboard.vue';
import { ResourcesToLevel } from './Task/ResourcesToLevel'; import { ResourcesToLevel } from './Task/ResourcesToLevel';
import { ConsoleLogger, Logger } from './Logger'; import { ConsoleLogger, Logger } from './Logger';
import { VillageState } from './State/VillageState'; import { VillageState } from './State/VillageState';
import { Resources, Village } from './Game';
interface QuickAction { interface QuickAction {
label: string; label: string;
@ -63,38 +64,7 @@ export class ControlPanel {
refreshVillages() { refreshVillages() {
this.villages = grabVillageList().map(village => { this.villages = grabVillageList().map(village => {
const state = new VillageState(village.id); return new VillageController(village, new VillageState(village.id), scheduler);
const resources = state.getResources();
const storage = state.getResourceStorage();
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,
crd: village.crd,
active: village.active,
lumber: resources.lumber,
clay: resources.clay,
iron: resources.iron,
crop: resources.crop,
lumber_hour: performance.lumber,
clay_hour: performance.clay,
iron_hour: performance.iron,
crop_hour: performance.crop,
lumber_need: requiredResources && requiredResources.lumber,
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,
};
}); });
for (let village of this.villages) { for (let village of this.villages) {
if (village.active) { if (village.active) {
@ -175,3 +145,110 @@ export class ControlPanel {
setTimeout(() => n && n.close(), 4000); setTimeout(() => n && n.close(), 4000);
} }
} }
class VillageController {
public readonly id;
public readonly name;
public readonly crd;
public readonly active;
public readonly lumber;
public readonly clay;
public readonly iron;
public readonly crop;
public readonly resources;
public readonly performance;
public readonly requiredResources;
public readonly totalRequiredResources;
public readonly storage;
public readonly lumber_hour;
public readonly clay_hour;
public readonly iron_hour;
public readonly crop_hour;
public readonly lumber_need;
public readonly clay_need;
public readonly iron_need;
public readonly crop_need;
public readonly lumber_total_need;
public readonly clay_total_need;
public readonly iron_total_need;
public readonly crop_total_need;
public readonly warehouse;
public readonly granary;
public readonly buildRemainingSeconds;
constructor(village: Village, state: VillageState, scheduler: Scheduler) {
const resources = state.getResources();
const storage = state.getResourceStorage();
const performance = state.getResourcesPerformance();
const buildQueueInfo = state.getBuildingQueueInfo();
const requiredResources = scheduler.getVillageRequiredResources(village.id);
const totalRequiredResources = scheduler.getTotalVillageRequiredResources(village.id);
this.id = village.id;
this.name = village.name;
this.crd = village.crd;
this.active = village.active;
this.lumber = resources.lumber;
this.clay = resources.clay;
this.iron = resources.iron;
this.crop = resources.crop;
this.resources = resources;
this.performance = performance;
this.requiredResources = requiredResources;
this.totalRequiredResources = totalRequiredResources;
this.storage = storage;
this.lumber_hour = performance.lumber;
this.clay_hour = performance.clay;
this.iron_hour = performance.iron;
this.crop_hour = performance.crop;
this.lumber_need = requiredResources && requiredResources.lumber;
this.clay_need = requiredResources && requiredResources.clay;
this.iron_need = requiredResources && requiredResources.iron;
this.crop_need = requiredResources && requiredResources.crop;
this.lumber_total_need = totalRequiredResources.lumber;
this.clay_total_need = totalRequiredResources.clay;
this.iron_total_need = totalRequiredResources.iron;
this.crop_total_need = totalRequiredResources.crop;
this.warehouse = storage.warehouse;
this.granary = storage.granary;
this.buildRemainingSeconds = buildQueueInfo.seconds;
}
timeToRequired() {
return this.timeToResources(this.requiredResources);
}
timeToTotalRequired() {
return this.timeToResources(this.totalRequiredResources);
}
private timeToResources(resources: Resources | undefined): number {
if (resources === undefined) {
return -2;
}
const time_to_lumber = this.timeToRes(this.resources.lumber, resources.lumber, this.performance.lumber);
const time_to_clay = this.timeToRes(this.resources.clay, resources.clay, this.performance.clay);
const time_to_iron = this.timeToRes(this.resources.iron, resources.iron, this.performance.iron);
const time_to_crop = this.timeToRes(this.resources.crop, resources.crop, this.performance.crop);
const min = Math.max(time_to_lumber, time_to_clay, time_to_iron, time_to_crop);
if (min === -1) {
return -1;
}
return Math.max(time_to_lumber, time_to_clay, time_to_iron, time_to_crop);
}
private timeToRes(current: number, desired: number, speed: number) {
if (current >= desired) {
return 0;
}
if (current < desired && speed <= 0) {
return -1;
}
const diff = desired - current;
return (diff / speed) * 3600;
}
}

View File

@ -33,34 +33,43 @@
</td> </td>
<td class="right" v-text="village.granary"></td> <td class="right" v-text="village.granary"></td>
</tr> </tr>
<tr class="performance-line">
<td class="right">Прирост:</td>
<td class="right">+{{ village.lumber_hour }}</td>
<td class="right">+{{ village.clay_hour }}</td>
<td class="right">+{{ village.iron_hour }}</td>
<td class="right">+{{ village.crop_hour }}</td>
<td></td>
<td></td>
</tr>
<tr class="required-line"> <tr class="required-line">
<td class="right">След:</td> <td class="right">След:</td>
<td class="right" v-text="village.lumber_need || ''"></td> <td class="right" v-text="village.lumber_need || ''"></td>
<td class="right" v-text="village.clay_need || ''"></td> <td class="right" v-text="village.clay_need || ''"></td>
<td class="right" v-text="village.iron_need || ''"></td> <td class="right" v-text="village.iron_need || ''"></td>
<td class="right" v-text="village.crop_need || ''"></td> <td class="right" v-text="village.crop_need || ''"></td>
<td></td> <td class="right" v-text="secondsToTime(village.buildRemainingSeconds)"></td>
<td></td> <td></td>
</tr> </tr>
<tr class="required-line"> <tr class="required-line">
<td class="right">Баланс:</td> <td class="right">Баланс:</td>
<td class="right"> <td class="right">
<resource :value="village.lumber - village.lumber_need"></resource> <resource :value="village.lumber - (village.lumber_need || 0)"></resource>
</td> </td>
<td class="right"> <td class="right">
<resource :value="village.clay - village.clay_need"></resource> <resource :value="village.clay - (village.clay_need || 0)"></resource>
</td> </td>
<td class="right"> <td class="right">
<resource :value="village.iron - village.iron_need"></resource> <resource :value="village.iron - (village.iron_need || 0)"></resource>
</td> </td>
<td class="right"> <td class="right">
<resource :value="village.crop - village.crop_need"></resource> <resource :value="village.crop - (village.crop_need || 0)"></resource>
</td> </td>
<td></td> <td class="right" v-text="timeToRequired(village)"></td>
<td></td> <td></td>
</tr> </tr>
<tr class="required-line"> <tr class="required-line">
<td class="right"></td> <td class="right">Баланс очереди:</td>
<td class="right"> <td class="right">
<resource :value="village.lumber - village.lumber_total_need"></resource> <resource :value="village.lumber - village.lumber_total_need"></resource>
</td> </td>
@ -73,16 +82,7 @@
<td class="right"> <td class="right">
<resource :value="village.crop - village.crop_total_need"></resource> <resource :value="village.crop - village.crop_total_need"></resource>
</td> </td>
<td></td> <td class="right" v-text="timeToTotalRequired(village)"></td>
<td></td>
</tr>
<tr class="performance-line">
<td class="right" v-text="secondsToTime(village.buildRemainingSeconds)"></td>
<td class="right">+{{ village.lumber_hour }}</td>
<td class="right">+{{ village.clay_hour }}</td>
<td class="right">+{{ village.iron_hour }}</td>
<td class="right">+{{ village.crop_hour }}</td>
<td></td>
<td></td> <td></td>
</tr> </tr>
<tr class="normal-line"> <tr class="normal-line">
@ -135,11 +135,29 @@ export default {
return path('/build.php', { newdid: village.id, gid: 19 }); return path('/build.php', { newdid: village.id, gid: 19 });
}, },
secondsToTime(value) { secondsToTime(value) {
if (value === 0) {
return '';
}
const hours = Math.floor(value / 3600); const hours = Math.floor(value / 3600);
const minutes = Math.floor((value % 3600) / 60); const minutes = Math.floor((value % 3600) / 60);
const seconds = value % 60; const seconds = Math.floor(value % 60);
return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
}, },
secondsToRequiredTime(value) {
if (value === -1) {
return '-';
}
if (value === -2) {
return '';
}
return this.secondsToTime(value);
},
timeToRequired(village) {
return this.secondsToRequiredTime(village.timeToRequired());
},
timeToTotalRequired(village) {
return this.secondsToRequiredTime(village.timeToTotalRequired());
},
}, },
}; };
</script> </script>