Improve resources to level task

This commit is contained in:
Anton Vakhrushev 2020-04-27 10:54:21 +03:00
parent f641649d2e
commit abb41dc86c
6 changed files with 51 additions and 40 deletions

View File

@ -1,10 +1,14 @@
import { ActionController, registerAction } from './ActionController'; import { ActionController, registerAction } from './ActionController';
import { Args } from '../Command'; import { Args } from '../Command';
import { Task } from '../Queue/TaskQueue'; import { Task } from '../Queue/TaskQueue';
import { AbortTaskError } from '../Errors';
@registerAction @registerAction
export class ClickButtonAction extends ActionController { export class ClickButtonAction extends ActionController {
async run(args: Args, task: Task): Promise<any> { async run(args: Args, task: Task): Promise<any> {
if (!args.selector) {
throw new AbortTaskError('No selector');
}
const el = jQuery(args.selector); const el = jQuery(args.selector);
if (el.length === 1) { if (el.length === 1) {
console.log('CLICK BUTTON', el); console.log('CLICK BUTTON', el);

View File

@ -1,10 +1,14 @@
import { ActionController, registerAction } from './ActionController'; import { ActionController, registerAction } from './ActionController';
import { Args } from '../Command'; import { Args } from '../Command';
import { Task } from '../Queue/TaskQueue'; import { Task } from '../Queue/TaskQueue';
import { AbortTaskError } from '../Errors';
@registerAction @registerAction
export class GoToPageAction extends ActionController { export class GoToPageAction extends ActionController {
async run(args: Args, task: Task): Promise<any> { async run(args: Args, task: Task): Promise<any> {
if (!args.path) {
throw new AbortTaskError('No path');
}
window.location.assign(args.path); window.location.assign(args.path);
} }
} }

View File

@ -1,11 +1,11 @@
import { ActionController, registerAction } from './ActionController'; import { ActionController, registerAction } from './ActionController';
import { Args } from '../Command'; import { Args } from '../Command';
import { ActionError, TryLaterError } from '../Errors'; import { AbortTaskError, ActionError, TryLaterError } from '../Errors';
import { Task } from '../Queue/TaskQueue'; import { Task } from '../Queue/TaskQueue';
import { grabResourceDeposits } from '../Page/SlotBlock'; import { grabResourceDeposits } from '../Page/SlotBlock';
import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask'; import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask';
import { ResourceDeposit } from '../Game'; import { ResourceDeposit } from '../Game';
import { aroundMinutes } from '../utils'; import { aroundMinutes, getNumber } from '../utils';
@registerAction @registerAction
export class UpgradeResourceToLevel extends ActionController { export class UpgradeResourceToLevel extends ActionController {
@ -16,35 +16,38 @@ export class UpgradeResourceToLevel extends ActionController {
} }
const villageId = args.villageId; const villageId = args.villageId;
const requiredLevel = args.level; if (villageId === undefined) {
const tasks = this.scheduler.getTaskItems(); throw new AbortTaskError('No village id');
}
const allUpgraded = deposits.reduce((memo, dep) => memo && dep.level >= requiredLevel, true); const requiredLevel = getNumber(args.level);
if (allUpgraded) { const notUpgraded = deposits.filter(dep => requiredLevel > dep.level);
if (notUpgraded.length === 0) {
this.scheduler.removeTask(task.id); this.scheduler.removeTask(task.id);
return; return;
} }
const isDepositTaskNotInQueue = (dep: ResourceDeposit) => const firstNotUpgraded = notUpgraded.sort((x, y) => x.level - y.level).shift();
if (firstNotUpgraded && this.isTaskNotInQueue(villageId, firstNotUpgraded)) {
this.scheduler.scheduleTask(UpgradeBuildingTask.name, { villageId, buildId: firstNotUpgraded.buildId });
}
throw new TryLaterError(aroundMinutes(10), 'Sleep for next round');
}
private isTaskNotInQueue(villageId: number, dep: ResourceDeposit): boolean {
const tasks = this.scheduler.getTaskItems();
return (
undefined === undefined ===
tasks.find( tasks.find(
task => task =>
task.name === UpgradeBuildingTask.name && task.name === UpgradeBuildingTask.name &&
task.args.villageId === villageId && task.args.villageId === villageId &&
task.args.buildId === dep.buildId task.args.buildId === dep.buildId
); )
);
const notUpgraded = deposits.sort((x, y) => x.level - y.level).filter(isDepositTaskNotInQueue);
if (notUpgraded.length === 0) {
throw new TryLaterError(aroundMinutes(10), 'No available deposits');
}
for (let dep of notUpgraded) {
this.scheduler.scheduleTask(UpgradeBuildingTask.name, { villageId, buildId: dep.buildId });
}
throw new TryLaterError(aroundMinutes(10), 'Sleep for next round');
} }
} }

View File

@ -15,7 +15,9 @@ export interface Args {
trainCount?: number; trainCount?: number;
resources?: ResourcesInterface; resources?: ResourcesInterface;
coordinates?: CoordinatesInterface; coordinates?: CoordinatesInterface;
[name: string]: any; level?: number;
selector?: string;
path?: string;
} }
export class Command { export class Command {

View File

@ -1,6 +1,6 @@
import { Args, Command } from '../Command'; import { Args, Command } from '../Command';
import { Task } from '../Queue/TaskQueue'; import { Task } from '../Queue/TaskQueue';
import { TaskController, registerTask } from './TaskController'; import { TaskController, registerTask, ActionDefinition } from './TaskController';
import { GoToPageAction } from '../Action/GoToPageAction'; import { GoToPageAction } from '../Action/GoToPageAction';
import { CompleteTaskAction } from '../Action/CompleteTaskAction'; import { CompleteTaskAction } from '../Action/CompleteTaskAction';
import { path } from '../utils'; import { path } from '../utils';
@ -8,15 +8,10 @@ import { UpgradeResourceToLevel } from '../Action/UpgradeResourceToLevel';
@registerTask @registerTask
export class ResourcesToLevel extends TaskController { export class ResourcesToLevel extends TaskController {
async run(task: Task) { defineActions(task: Task): Array<ActionDefinition> {
const args: Args = { ...task.args, taskId: task.id }; return [
this.scheduler.scheduleActions([ [GoToPageAction.name, { path: path('/dorf1.php', { newdid: task.args.villageId }) }],
new Command(GoToPageAction.name, { [UpgradeResourceToLevel.name, {}],
...args, ];
path: path('/dorf1.php', { newdid: args.villageId }),
}),
new Command(UpgradeResourceToLevel.name, args),
new Command(CompleteTaskAction.name, args),
]);
} }
} }

View File

@ -4,25 +4,28 @@ export function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
} }
function randomInRange(from: number, to: number): number {
const delta = to - from;
const variation = Math.random() * delta;
return from + variation;
}
export async function sleepMicro() { export async function sleepMicro() {
let ms = 2000 + Math.random() * 500; return await sleep(randomInRange(2000, 2500));
return await sleep(ms);
} }
export async function sleepShort() { export async function sleepShort() {
let ms = 3000 + Math.random() * 1000; return await sleep(randomInRange(3000, 4000));
return await sleep(ms);
} }
export async function sleepLong() { export async function sleepLong() {
let ms = 120_000 + Math.random() * 300_000; return await sleep(randomInRange(120_000, 420_00));
return await sleep(ms);
} }
export function aroundMinutes(minutes: number) { export function aroundMinutes(minutes: number) {
const seconds = minutes * 60; const seconds = minutes * 60;
const delta = Math.floor(seconds * 0.9); const delta = Math.floor(seconds * 0.1);
return seconds - delta + Math.floor(Math.random() * 2 * delta); return randomInRange(seconds - delta, seconds + delta);
} }
export async function waitForLoad() { export async function waitForLoad() {