185 lines
6.0 KiB
TypeScript
185 lines
6.0 KiB
TypeScript
import { Scheduler } from './Scheduler';
|
|
import { BuildingPageController } from './Page/BuildingPageController';
|
|
import { UpgradeBuildingTask } from './Handler/Task/UpgradeBuildingTask';
|
|
import { grabActiveVillageId } from './Page/VillageBlock';
|
|
import {
|
|
onBuildingSlotCtrlClick,
|
|
onResourceSlotCtrlClick,
|
|
showBuildingSlotIds,
|
|
showResourceSlotIds,
|
|
} from './Page/SlotBlock';
|
|
import Vue from 'vue';
|
|
import Vuex from 'vuex';
|
|
import DashboardApp from './Dashboard/Dashboard.vue';
|
|
import { createStore } from './Dashboard/Store';
|
|
import { ConsoleLogger, Logger } from './Logger';
|
|
import { DataStorage } from './Storage/DataStorage';
|
|
import {
|
|
getBuildingPageAttributes,
|
|
isAdventurePage,
|
|
isBuildingPage,
|
|
isTrapperPage,
|
|
} from './Page/PageDetector';
|
|
import { ExecutionStorage } from './Storage/ExecutionStorage';
|
|
import { VillageState } from './Village/VillageState';
|
|
import { VillageFactory } from './Village/VillageFactory';
|
|
import { uniqId } from './Helpers/Identity';
|
|
import { timestamp } from './Helpers/Time';
|
|
import { notify, parseLocation, waitForLoad } from './Helpers/Browser';
|
|
import { Action } from './Queue/Action';
|
|
import { Task } from './Queue/Task';
|
|
import { HeroAttributes } from './Core/Hero';
|
|
import { HeroStorage } from './Storage/HeroStorage';
|
|
import { showAdventureDifficulty } from './Page/AdventurePage';
|
|
import { getTrapStats } from './Page/BuildingPage/TrapperPage';
|
|
|
|
Vue.use(Vuex);
|
|
|
|
interface GameState {
|
|
name: string;
|
|
version: string;
|
|
activeVillageState: VillageState | undefined;
|
|
villageStates: ReadonlyArray<VillageState>;
|
|
heroAttr: HeroAttributes;
|
|
taskList: ReadonlyArray<Task>;
|
|
actionList: ReadonlyArray<Action>;
|
|
pauseSeconds: number;
|
|
|
|
refresh(): void;
|
|
removeTask(taskId: string): void;
|
|
refreshVillages(): void;
|
|
pause(): void;
|
|
}
|
|
|
|
export class ControlPanel {
|
|
private readonly version: string;
|
|
private readonly scheduler: Scheduler;
|
|
private readonly logger: Logger;
|
|
private readonly villageFactory: VillageFactory;
|
|
|
|
constructor(version: string, scheduler: Scheduler, villageFactory: VillageFactory) {
|
|
this.version = version;
|
|
this.scheduler = scheduler;
|
|
this.villageFactory = villageFactory;
|
|
this.logger = new ConsoleLogger(this.constructor.name);
|
|
}
|
|
|
|
async run() {
|
|
await waitForLoad();
|
|
|
|
const p = parseLocation();
|
|
const villageId = grabActiveVillageId();
|
|
|
|
const scheduler = this.scheduler;
|
|
const villageFactory = this.villageFactory;
|
|
|
|
const executionState = new ExecutionStorage();
|
|
const heroStorage = new HeroStorage();
|
|
|
|
const state: GameState = {
|
|
name: 'Control',
|
|
version: this.version,
|
|
activeVillageState: undefined,
|
|
villageStates: [],
|
|
heroAttr: HeroAttributes.default(),
|
|
taskList: [],
|
|
actionList: [],
|
|
pauseSeconds: 0,
|
|
|
|
refresh() {
|
|
this.heroAttr = heroStorage.getAttributes();
|
|
this.taskList = scheduler.getTaskItems();
|
|
this.actionList = scheduler.getActionItems();
|
|
const { pauseTs } = executionState.getExecutionSettings();
|
|
this.pauseSeconds = pauseTs - timestamp();
|
|
this.refreshVillages();
|
|
},
|
|
|
|
removeTask(taskId: string) {
|
|
scheduler.removeTask(taskId);
|
|
this.taskList = scheduler.getTaskItems();
|
|
},
|
|
|
|
refreshVillages() {
|
|
this.villageStates = villageFactory.getAllVillageStates();
|
|
for (let state of this.villageStates) {
|
|
if (state.village.active) {
|
|
this.activeVillageState = state;
|
|
}
|
|
}
|
|
},
|
|
|
|
pause() {
|
|
executionState.setExecutionSettings({ pauseTs: timestamp() + 120 });
|
|
},
|
|
};
|
|
|
|
state.refresh();
|
|
|
|
setInterval(() => {
|
|
state.refresh();
|
|
}, 3000);
|
|
|
|
DataStorage.onChange(() => state.refresh());
|
|
|
|
const getBuildingsInQueue = () =>
|
|
this.villageFactory
|
|
.getById(villageId)
|
|
.taskCollection()
|
|
.getTasks()
|
|
.filter((t) => t.name === UpgradeBuildingTask.name)
|
|
.map((t) => t.args.buildId || 0);
|
|
|
|
if (p.pathname === '/dorf1.php') {
|
|
showResourceSlotIds(getBuildingsInQueue());
|
|
onResourceSlotCtrlClick((buildId) => {
|
|
this.onSlotCtrlClick(villageId, buildId);
|
|
showResourceSlotIds(getBuildingsInQueue());
|
|
});
|
|
}
|
|
|
|
if (p.pathname === '/dorf2.php') {
|
|
showBuildingSlotIds(getBuildingsInQueue());
|
|
onBuildingSlotCtrlClick((buildId) => {
|
|
this.onSlotCtrlClick(villageId, buildId);
|
|
showBuildingSlotIds(getBuildingsInQueue());
|
|
});
|
|
}
|
|
|
|
if (isBuildingPage()) {
|
|
const buildPage = new BuildingPageController(
|
|
this.scheduler,
|
|
getBuildingPageAttributes(),
|
|
this.villageFactory.getById(villageId).controller()
|
|
);
|
|
buildPage.run();
|
|
}
|
|
|
|
if (isAdventurePage()) {
|
|
showAdventureDifficulty();
|
|
}
|
|
|
|
if (isTrapperPage()) {
|
|
console.log('TRAPS', getTrapStats());
|
|
}
|
|
|
|
this.createControlPanel(state, villageFactory);
|
|
}
|
|
|
|
private createControlPanel(gameState: GameState, villageFactory: VillageFactory) {
|
|
const appId = `app-${uniqId()}`;
|
|
jQuery('body').prepend(`<div id="${appId}"></div>`);
|
|
new Vue({
|
|
el: `#${appId}`,
|
|
data: gameState,
|
|
store: createStore(villageFactory),
|
|
render: (h) => h(DashboardApp),
|
|
});
|
|
}
|
|
|
|
private onSlotCtrlClick(villageId: number, buildId: number) {
|
|
this.scheduler.scheduleTask(UpgradeBuildingTask.name, { villageId, buildId });
|
|
notify(`Building ${buildId} scheduled`);
|
|
}
|
|
}
|