Add building queue time grabber
This commit is contained in:
		| @@ -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<any> { | ||||
|         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' | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -42,7 +42,7 @@ | ||||
|             <td class="right" v-text="village.granary"></td> | ||||
|           </tr> | ||||
|           <tr class="performance-line"> | ||||
|             <td></td> | ||||
|             <td class="right small" v-text="secondsToTime(village.buildRemainingSeconds)"></td> | ||||
|             <td class="right small">+{{ village.lumber_hour }}</td> | ||||
|             <td class="right small">+{{ village.clay_hour }}</td> | ||||
|             <td class="right small">+{{ village.iron_hour }}</td> | ||||
| @@ -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')}`; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -90,6 +90,13 @@ export class Village { | ||||
|  | ||||
| export type VillageList = Array<Village>; | ||||
|  | ||||
| export class BuildingQueueInfo { | ||||
|     readonly seconds: number; | ||||
|     constructor(seconds: number) { | ||||
|         this.seconds = seconds; | ||||
|     } | ||||
| } | ||||
|  | ||||
| export type HeroAllResourcesType = 'all'; | ||||
| export const HeroAllResources: HeroAllResourcesType = 'all'; | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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<StateGrabber> = []; | ||||
| @@ -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() { | ||||
|   | ||||
| @@ -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()); | ||||
|     } | ||||
| } | ||||
| @@ -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; | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user