147 lines
5.9 KiB
TypeScript
147 lines
5.9 KiB
TypeScript
import { notify } from '../utils';
|
|
import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask';
|
|
import { Scheduler } from '../Scheduler';
|
|
import { TrainTroopTask } from '../Task/TrainTroopTask';
|
|
import { grabActiveVillageId, grabVillageList } from './VillageBlock';
|
|
import { ConsoleLogger, Logger } from '../Logger';
|
|
import { createBuildButton, createUpgradeButton } from './BuildingPage/BuildingPage';
|
|
import { BuildBuildingTask } from '../Task/BuildBuildingTask';
|
|
import { Resources } from '../Core/Resources';
|
|
import { Coordinates } from '../Core/Village';
|
|
import { SendResourcesTask } from '../Task/SendResourcesTask';
|
|
import { EMBASSY_ID, HORSE_STABLE_ID, PALACE_ID, QUARTERS_ID } from '../Core/Buildings';
|
|
import { BuildingPageAttributes, isForgePage, isGuildHallPage, isMarketSendResourcesPage } from './PageDetectors';
|
|
import { createTrainTroopButtons } from './BuildingPage/TrooperPage';
|
|
import { createSendResourcesButton } from './BuildingPage/MarketPage';
|
|
import { createResearchButtons } from './BuildingPage/ForgePage';
|
|
import { ForgeImprovementTask } from '../Task/ForgeImprovementTask';
|
|
import { createCelebrationButtons } from './BuildingPage/GuildHallPage';
|
|
import { CelebrationTask } from '../Task/CelebrationTask';
|
|
import { VillageController } from '../VillageController';
|
|
|
|
export class BuildingPageController {
|
|
private scheduler: Scheduler;
|
|
private readonly attributes: BuildingPageAttributes;
|
|
private villageController: VillageController;
|
|
private readonly logger: Logger;
|
|
|
|
constructor(scheduler: Scheduler, attributes: BuildingPageAttributes, villageController: VillageController) {
|
|
this.scheduler = scheduler;
|
|
this.attributes = attributes;
|
|
this.villageController = villageController;
|
|
this.logger = new ConsoleLogger(this.constructor.name);
|
|
}
|
|
|
|
run() {
|
|
const { buildTypeId, sheetId } = this.attributes;
|
|
this.logger.info('BUILD PAGE DETECTED', 'ID', this.attributes.buildId, this.attributes);
|
|
|
|
if (buildTypeId) {
|
|
createUpgradeButton(res => this.onScheduleUpgradeBuilding(res));
|
|
} else {
|
|
createBuildButton((buildTypeId, res) => this.onScheduleBuildBuilding(buildTypeId, res));
|
|
}
|
|
|
|
if (buildTypeId === QUARTERS_ID) {
|
|
createTrainTroopButtons((troopId, res, count) => this.onScheduleTrainTroopers(troopId, res, count));
|
|
}
|
|
|
|
if (buildTypeId === HORSE_STABLE_ID) {
|
|
createTrainTroopButtons((troopId, res, count) => this.onScheduleTrainTroopers(troopId, res, count));
|
|
}
|
|
|
|
if (buildTypeId === EMBASSY_ID && sheetId === 1) {
|
|
createTrainTroopButtons((troopId, res, count) => this.onScheduleTrainTroopers(troopId, res, count));
|
|
}
|
|
|
|
if (buildTypeId === PALACE_ID && sheetId === 1) {
|
|
createTrainTroopButtons((troopId, res, count) => this.onScheduleTrainTroopers(troopId, res, count));
|
|
}
|
|
|
|
if (isMarketSendResourcesPage()) {
|
|
createSendResourcesButton((res, crd) => this.onSendResources(crd));
|
|
}
|
|
|
|
if (isForgePage()) {
|
|
createResearchButtons((res, unitId) => this.onResearch(res, unitId));
|
|
}
|
|
|
|
if (isGuildHallPage()) {
|
|
createCelebrationButtons(res => this.onCelebration(res));
|
|
}
|
|
}
|
|
|
|
private onScheduleBuildBuilding(buildTypeId: number, resources: Resources) {
|
|
const buildId = this.attributes.buildId;
|
|
const categoryId = this.attributes.categoryId;
|
|
const villageId = grabActiveVillageId();
|
|
this.villageController.addTask(BuildBuildingTask.name, {
|
|
villageId,
|
|
buildId,
|
|
categoryId,
|
|
buildTypeId,
|
|
resources,
|
|
});
|
|
notify(`Building ${buildId} scheduled`);
|
|
}
|
|
|
|
private onScheduleUpgradeBuilding(resources: Resources) {
|
|
const buildId = this.attributes.buildId;
|
|
const villageId = grabActiveVillageId();
|
|
this.villageController.addTask(UpgradeBuildingTask.name, { villageId, buildId, resources });
|
|
notify(`Upgrading ${buildId} scheduled`);
|
|
}
|
|
|
|
private onScheduleTrainTroopers(troopId: number, resources: Resources, trainCount: number) {
|
|
const args = {
|
|
villageId: grabActiveVillageId(),
|
|
buildId: this.attributes.buildId,
|
|
buildTypeId: this.attributes.buildTypeId,
|
|
sheetId: this.attributes.sheetId,
|
|
troopId,
|
|
trainCount,
|
|
troopResources: resources,
|
|
resources: resources.scale(trainCount),
|
|
};
|
|
this.villageController.addTask(TrainTroopTask.name, args);
|
|
notify(`Training ${trainCount} troopers scheduled`);
|
|
}
|
|
|
|
private onSendResources(coordinates: Coordinates) {
|
|
const villageId = grabActiveVillageId();
|
|
const targetVillage = grabVillageList().find(v => v.crd.eq(coordinates));
|
|
this.scheduler.scheduleTask(SendResourcesTask.name, {
|
|
villageId: villageId,
|
|
targetVillageId: targetVillage?.id,
|
|
buildTypeId: this.attributes.buildTypeId,
|
|
buildId: this.attributes.buildId,
|
|
tabId: this.attributes.tabId,
|
|
coordinates,
|
|
});
|
|
notify(`Send resources from ${villageId} to ${JSON.stringify(coordinates)}`);
|
|
}
|
|
|
|
private onResearch(resources: Resources, unitId: number) {
|
|
const villageId = grabActiveVillageId();
|
|
this.villageController.addTask(ForgeImprovementTask.name, {
|
|
villageId,
|
|
buildTypeId: this.attributes.buildTypeId,
|
|
buildId: this.attributes.buildId,
|
|
unitId,
|
|
resources,
|
|
});
|
|
notify(`Researching ${unitId} scheduled`);
|
|
}
|
|
|
|
private onCelebration(resources: Resources) {
|
|
const villageId = grabActiveVillageId();
|
|
this.villageController.addTask(CelebrationTask.name, {
|
|
villageId,
|
|
buildTypeId: this.attributes.buildTypeId,
|
|
buildId: this.attributes.buildId,
|
|
resources,
|
|
});
|
|
notify(`Celebration scheduled`);
|
|
}
|
|
}
|