diff --git a/src/Dashboard/Components/Header.vue b/src/Dashboard/Components/Header.vue index c464802..6a29bea 100644 --- a/src/Dashboard/Components/Header.vue +++ b/src/Dashboard/Components/Header.vue @@ -16,7 +16,7 @@ export default { }, computed: { villageName() { - let village = this.shared.village; + let village = this.shared.activeVillage; return village ? village.name : 'Unknown'; }, }, diff --git a/src/Dashboard/Components/TaskList.vue b/src/Dashboard/Components/TaskList.vue index 8c4318d..9381bb4 100644 --- a/src/Dashboard/Components/TaskList.vue +++ b/src/Dashboard/Components/TaskList.vue @@ -24,9 +24,9 @@ export default { data() { return { shared: this.$root.$data, + activeVillage: this.$root.$data.activeVillage, }; }, - computed: {}, methods: { formatDate(ts) { const d = new Date(ts * 1000); @@ -34,7 +34,7 @@ export default { }, isThisVillageTask(task) { const taskVillageId = (task.args || {}).villageId; - const currentVillageId = (this.shared.village || {}).id; + const currentVillageId = this.activeVillage.id; return taskVillageId !== undefined && taskVillageId === currentVillageId; }, onRemove(taskId) { diff --git a/src/Dashboard/Components/VillageStateList.vue b/src/Dashboard/Components/VillageStateList.vue index 038e999..acd5d31 100644 --- a/src/Dashboard/Components/VillageStateList.vue +++ b/src/Dashboard/Components/VillageStateList.vue @@ -1,21 +1,55 @@ @@ -27,20 +61,22 @@ export default { data() { return { shared: this.$root.$data, + activeVillage: this.$root.$data.activeVillage, }; }, - computed: { - activeVillageId() { - return this.shared.village.id; - }, - }, methods: { - resources(id) { - return this.shared.getVillageResources(id); - }, path(name, args) { return path(name, args); }, + marketPath(fromVillage, toVillage) { + return path('/build.php', { newdid: fromVillage.id, gid: 17, t: 5, x: toVillage.crd.x, y: toVillage.crd.y }); + }, + warehousePath(village) { + return path('/build.php', { newdid: village.id, gid: 10 }); + }, + quartersPath(village) { + return path('/build.php', { newdid: village.id, gid: 19 }); + }, }, }; @@ -52,11 +88,30 @@ export default { } .village-table td { - border-top: 1px solid #ddd; padding: 4px; } .village-table td.active { font-weight: bold; } + +.top-line td { + border-top: 1px solid #ddd; +} + +.right { + text-align: right; +} + +.small { + font-size: 90%; +} + +.village-quick-link { + display: inline-block; +} + +.village-quick-link + .village-quick-link { + margin-left: 0.4em; +} diff --git a/src/Dashboard/Dashboard.ts b/src/Dashboard/Dashboard.ts index 183d659..bda42b5 100644 --- a/src/Dashboard/Dashboard.ts +++ b/src/Dashboard/Dashboard.ts @@ -3,7 +3,7 @@ import { getNumber, uniqId, waitForLoad } from '../utils'; import { Scheduler } from '../Scheduler'; import { BuildPage } from '../Page/BuildPage'; import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask'; -import { grabActiveVillage, grabActiveVillageId, grabVillageList } from '../Page/VillageBlock'; +import { grabActiveVillageId, grabVillageList } from '../Page/VillageBlock'; import { grabResourceDeposits, onResourceSlotCtrlClick, @@ -14,7 +14,6 @@ import Vue from 'vue'; import DashboardApp from './Components/DashboardApp.vue'; import { ResourcesToLevel } from '../Task/ResourcesToLevel'; import { Logger } from '../Logger'; -import { Resources } from '../Game'; import { VillageState } from '../State/VillageState'; import { StateGrabberManager } from '../State/StateGrabberManager'; @@ -51,10 +50,10 @@ export class Dashboard { const state = { name: 'Dashboard', - village: grabActiveVillage(), - villages: grabVillageList(), version: this.version, - taskList: this.scheduler.getTaskItems(), + activeVillage: {}, + villages: [], + taskList: [], quickActions: quickActions, refreshTasks() { @@ -66,13 +65,42 @@ export class Dashboard { this.taskList = scheduler.getTaskItems(); }, - getVillageResources(villageId): Resources { - const state = new VillageState(villageId); - return state.getResources(); + refreshVillages() { + this.villages = grabVillageList().map(village => { + const state = new VillageState(village.id); + const resources = state.getResources(); + const storage = state.getResourceStorage(); + const performance = state.getResourcesPerformance(); + 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, + warehouse: storage.warehouse, + granary: storage.granary, + }; + }); + for (let village of this.villages) { + if (village.active) { + this.activeVillage = village; + } + } }, }; - setInterval(() => state.refreshTasks(), 1000); + state.refreshTasks(); + setInterval(() => state.refreshTasks(), 2000); + + state.refreshVillages(); + setInterval(() => state.refreshVillages(), 5000); const tasks = this.scheduler.getTaskItems(); const buildingsInQueue = tasks diff --git a/src/Page/VillageBlock.ts b/src/Page/VillageBlock.ts index 9f097a9..3d85503 100644 --- a/src/Page/VillageBlock.ts +++ b/src/Page/VillageBlock.ts @@ -1,4 +1,4 @@ -import { Coordinates, Village, VillageList } from '../Game'; +import { Coordinates, Resources, Village, VillageList } from '../Game'; import { GrabError } from '../Errors'; import * as URLParse from 'url-parse'; import { getNumber } from '../utils'; @@ -56,3 +56,19 @@ function grabVillageInfo($el): Village { ); return new Village(id, name, active, new Coordinates(x, y)); } + +export function grabResourcesPerformance(): Resources { + const $el = jQuery('#production'); + if ($el.length !== 1) { + throw new GrabError(); + } + + const $nums = $el.find('td.num'); + + return new Resources( + getNumber($nums.get(0).innerText), + getNumber($nums.get(1).innerText), + getNumber($nums.get(2).innerText), + getNumber($nums.get(3).innerText) + ); +} diff --git a/src/State/ResourcePerformanceGrabber.ts b/src/State/ResourcePerformanceGrabber.ts new file mode 100644 index 0000000..0db00bb --- /dev/null +++ b/src/State/ResourcePerformanceGrabber.ts @@ -0,0 +1,17 @@ +import * as URLParse from 'url-parse'; +import { StateGrabber } from './StateGrabber'; +import { grabActiveVillageId, grabResourcesPerformance } from '../Page/VillageBlock'; +import { VillageState } from './VillageState'; + +export class ResourcePerformanceGrabber extends StateGrabber { + grab(): void { + const p = new URLParse(window.location.href, true); + if (p.pathname !== '/dorf1.php') { + return; + } + + const villageId = grabActiveVillageId(); + const state = new VillageState(villageId); + state.storeResourcesPerformance(grabResourcesPerformance()); + } +} diff --git a/src/State/StateGrabberManager.ts b/src/State/StateGrabberManager.ts index f54c099..1d89541 100644 --- a/src/State/StateGrabberManager.ts +++ b/src/State/StateGrabberManager.ts @@ -1,12 +1,14 @@ import { StateGrabber } from './StateGrabber'; import { ResourceGrabber } from './ResourceGrabber'; +import { ResourcePerformanceGrabber } from './ResourcePerformanceGrabber'; export class StateGrabberManager { - private grabbers: Array = []; + private readonly grabbers: Array = []; constructor() { this.grabbers = []; this.grabbers.push(new ResourceGrabber()); + this.grabbers.push(new ResourcePerformanceGrabber()); } grab() { diff --git a/src/State/VillageState.ts b/src/State/VillageState.ts index 1650998..159c272 100644 --- a/src/State/VillageState.ts +++ b/src/State/VillageState.ts @@ -1,6 +1,10 @@ import { DataStorage } from '../Storage/DataStorage'; import { Resources, ResourceStorage } from '../Game'; +const RESOURCES_KEY = 'res'; +const CAPACITY_KEY = 'cap'; +const PERFORMANCE_KEY = 'perf'; + export class VillageState { private storage: DataStorage; constructor(villageId: number) { @@ -8,22 +12,32 @@ export class VillageState { } storeResources(resources: Resources) { - this.storage.set('res', resources); + this.storage.set(RESOURCES_KEY, resources); } getResources(): Resources { - let plain = this.storage.get('res'); + let plain = this.storage.get(RESOURCES_KEY); let res = new Resources(0, 0, 0, 0); return Object.assign(res, plain) as Resources; } storeResourceStorage(storage: ResourceStorage) { - this.storage.set('cap', storage); + this.storage.set(CAPACITY_KEY, storage); } getResourceStorage(): ResourceStorage { - let plain = this.storage.get('res'); + let plain = this.storage.get(CAPACITY_KEY); let res = new ResourceStorage(0, 0); return Object.assign(res, plain) as ResourceStorage; } + + storeResourcesPerformance(resources: Resources) { + this.storage.set(PERFORMANCE_KEY, resources); + } + + getResourcesPerformance(): Resources { + let plain = this.storage.get(PERFORMANCE_KEY); + let res = new Resources(0, 0, 0, 0); + return Object.assign(res, plain) as Resources; + } }