travian/src/Page/BuildingPageController.ts

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`);
}
}