Improve resources to level task
This commit is contained in:
parent
f641649d2e
commit
abb41dc86c
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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),
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
19
src/utils.ts
19
src/utils.ts
@ -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() {
|
||||||
|
Loading…
Reference in New Issue
Block a user