diff --git a/src/Action/CheckBuildingRemainingTimeAction.ts b/src/Action/CheckBuildingRemainingTimeAction.ts index 52e6736..3e04c2c 100644 --- a/src/Action/CheckBuildingRemainingTimeAction.ts +++ b/src/Action/CheckBuildingRemainingTimeAction.ts @@ -2,22 +2,19 @@ import { ActionController, registerAction } from './ActionController'; import { Args } from '../Common'; import { Task } from '../Storage/TaskQueue'; import { BuildingQueueFullError } from '../Errors'; -import { grabActiveVillageId } from '../Page/VillageBlock'; +import { grabActiveVillageId, grabBuildingQueueInfo } from '../Page/VillageBlock'; @registerAction export class CheckBuildingRemainingTimeAction extends ActionController { async run(args: Args, task: Task): Promise { - const timer = jQuery('.buildDuration .timer'); - if (timer.length === 1) { - const remainingSeconds = Number(timer.attr('value')); - if (remainingSeconds > 0) { - throw new BuildingQueueFullError( - task.id, - grabActiveVillageId(), - remainingSeconds + 1, - 'Building queue is full' - ); - } + const info = grabBuildingQueueInfo(); + if (info.seconds > 0) { + throw new BuildingQueueFullError( + task.id, + grabActiveVillageId(), + info.seconds + 1, + 'Building queue is full' + ); } } } diff --git a/src/ControlPanel.ts b/src/ControlPanel.ts index 87017df..c243884 100644 --- a/src/ControlPanel.ts +++ b/src/ControlPanel.ts @@ -71,6 +71,7 @@ export class ControlPanel { const resources = state.getResources(); const storage = state.getResourceStorage(); const performance = state.getResourcesPerformance(); + const buildQueueInfo = state.getBuildingQueueInfo(); return { id: village.id, name: village.name, @@ -86,6 +87,7 @@ export class ControlPanel { crop_hour: performance.crop, warehouse: storage.warehouse, granary: storage.granary, + buildRemainingSeconds: buildQueueInfo.seconds, }; }); for (let village of this.villages) { diff --git a/src/DashboardView/VillageStateList.vue b/src/DashboardView/VillageStateList.vue index 6846ed5..076dfcd 100644 --- a/src/DashboardView/VillageStateList.vue +++ b/src/DashboardView/VillageStateList.vue @@ -42,7 +42,7 @@ - + +{{ village.lumber_hour }} +{{ village.clay_hour }} +{{ village.iron_hour }} @@ -108,6 +108,12 @@ export default { const minutes = Math.round((value - hours) * 60); return `${hours}:${String(minutes).padStart(2, '0')}`; }, + secondsToTime(value) { + const hours = Math.floor(value / 3600); + const minutes = Math.floor((value % 3600) / 60); + const seconds = value % 60; + return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; + }, }, }; diff --git a/src/Game.ts b/src/Game.ts index d03a098..6d0059f 100644 --- a/src/Game.ts +++ b/src/Game.ts @@ -90,6 +90,13 @@ export class Village { export type VillageList = Array; +export class BuildingQueueInfo { + readonly seconds: number; + constructor(seconds: number) { + this.seconds = seconds; + } +} + export type HeroAllResourcesType = 'all'; export const HeroAllResources: HeroAllResourcesType = 'all'; diff --git a/src/Page/VillageBlock.ts b/src/Page/VillageBlock.ts index 9c49e77..375ec62 100644 --- a/src/Page/VillageBlock.ts +++ b/src/Page/VillageBlock.ts @@ -1,4 +1,4 @@ -import { Coordinates, Resources, Village, VillageList } from '../Game'; +import { BuildingQueueInfo, Coordinates, Resources, Village, VillageList } from '../Game'; import { GrabError } from '../Errors'; import { getNumber, parseLocation } from '../utils'; @@ -59,3 +59,14 @@ export function grabResourcesPerformance(): Resources { getNumber($nums.get(3).innerText) ); } + +export function grabBuildingQueueInfo(): BuildingQueueInfo { + const timer = jQuery('.buildDuration .timer'); + if (timer.length !== 1) { + throw new GrabError(); + } + + const remainingSeconds = getNumber(timer.attr('value')); + + return new BuildingQueueInfo(remainingSeconds); +} diff --git a/src/State/StateGrabberManager.ts b/src/State/StateGrabberManager.ts index 1d89541..354da3e 100644 --- a/src/State/StateGrabberManager.ts +++ b/src/State/StateGrabberManager.ts @@ -1,6 +1,6 @@ import { StateGrabber } from './StateGrabber'; import { ResourceGrabber } from './ResourceGrabber'; -import { ResourcePerformanceGrabber } from './ResourcePerformanceGrabber'; +import { VillageOverviewPageGrabber } from './VillageOverviewPageGrabber'; export class StateGrabberManager { private readonly grabbers: Array = []; @@ -8,7 +8,7 @@ export class StateGrabberManager { constructor() { this.grabbers = []; this.grabbers.push(new ResourceGrabber()); - this.grabbers.push(new ResourcePerformanceGrabber()); + this.grabbers.push(new VillageOverviewPageGrabber()); } grab() { diff --git a/src/State/ResourcePerformanceGrabber.ts b/src/State/VillageOverviewPageGrabber.ts similarity index 65% rename from src/State/ResourcePerformanceGrabber.ts rename to src/State/VillageOverviewPageGrabber.ts index dfbae95..1350736 100644 --- a/src/State/ResourcePerformanceGrabber.ts +++ b/src/State/VillageOverviewPageGrabber.ts @@ -1,9 +1,9 @@ import { StateGrabber } from './StateGrabber'; -import { grabActiveVillageId, grabResourcesPerformance } from '../Page/VillageBlock'; +import { grabActiveVillageId, grabBuildingQueueInfo, grabResourcesPerformance } from '../Page/VillageBlock'; import { VillageState } from './VillageState'; import { parseLocation } from '../utils'; -export class ResourcePerformanceGrabber extends StateGrabber { +export class VillageOverviewPageGrabber extends StateGrabber { grab(): void { const p = parseLocation(); if (p.pathname !== '/dorf1.php') { @@ -13,5 +13,6 @@ export class ResourcePerformanceGrabber extends StateGrabber { const villageId = grabActiveVillageId(); const state = new VillageState(villageId); state.storeResourcesPerformance(grabResourcesPerformance()); + state.storeBuildingQueueInfo(grabBuildingQueueInfo()); } } diff --git a/src/State/VillageState.ts b/src/State/VillageState.ts index 159c272..1bd7f0e 100644 --- a/src/State/VillageState.ts +++ b/src/State/VillageState.ts @@ -1,9 +1,10 @@ import { DataStorage } from '../Storage/DataStorage'; -import { Resources, ResourceStorage } from '../Game'; +import { BuildingQueueInfo, Resources, ResourceStorage } from '../Game'; const RESOURCES_KEY = 'res'; const CAPACITY_KEY = 'cap'; const PERFORMANCE_KEY = 'perf'; +const BUILDING_QUEUE_KEY = 'bq'; export class VillageState { private storage: DataStorage; @@ -40,4 +41,14 @@ export class VillageState { let res = new Resources(0, 0, 0, 0); return Object.assign(res, plain) as Resources; } + + storeBuildingQueueInfo(info: BuildingQueueInfo): void { + this.storage.set(BUILDING_QUEUE_KEY, info); + } + + getBuildingQueueInfo(): BuildingQueueInfo { + let plain = this.storage.get(BUILDING_QUEUE_KEY); + let res = new BuildingQueueInfo(0); + return Object.assign(res, plain) as BuildingQueueInfo; + } }