Add hero resource switch

This commit is contained in:
2020-04-04 15:41:18 +03:00
parent 6e85f9f443
commit d85490958b
8 changed files with 151 additions and 13 deletions

View File

@ -0,0 +1,71 @@
import { ActionController, registerAction } from './ActionController';
import { Args } from '../Common';
import { Task } from '../Storage/TaskQueue';
import { getNumber, trimPrefix } from '../utils';
import { AbortTaskError, ActionError } from '../Errors';
interface Resource {
type: number;
value: number;
}
const ALL = 0;
@registerAction
export class BalanceHeroResourcesAction extends ActionController {
async run(args: Args, task: Task): Promise<any> {
const res = this.getResources();
const currentType = this.getCurrentHeroResource(task);
console.log('RESOURCES', res);
console.log('CURRENT TYPE', currentType);
const sorted = res.sort((x, y) => x.value - y.value);
const min = sorted[0];
const max = sorted[sorted.length - 1];
const delta = max.value - min.value;
const eps = max.value / 10;
console.log('MIN', min, 'MAX', max, 'DELTA', delta, 'EPS', eps);
const resType = delta > eps ? min.type : ALL;
if (resType !== currentType) {
this.changeToHeroResource(task, resType);
}
}
private getResources(): Array<Resource> {
const res = this.state.get('resources');
const resList: Array<Resource> = [];
for (let r in res) {
const type = getNumber(r);
const value = getNumber(res[r]);
resList.push({ type, value });
}
return resList;
}
private getCurrentHeroResource(task: Task): number {
for (let type of [0, 1, 2, 3, 4]) {
const input = jQuery(`#resourceHero${type}`);
if (input.length !== 1) {
throw new ActionError(task.id, `Hero resource ${type} not found`);
}
if (input.prop('checked')) {
return type;
}
}
return 0;
}
private changeToHeroResource(task: Task, type: number) {
const input = jQuery(`#resourceHero${type}`);
if (input.length !== 1) {
throw new ActionError(task.id, `Hero resource ${type} not found`);
}
const btn = jQuery('#saveHeroAttributes');
if (btn.length !== 1) {
throw new ActionError(task.id, `Hero resource button not found`);
}
input.trigger('click');
btn.trigger('click');
}
}

View File

@ -2,6 +2,7 @@ import { ActionController, registerAction } from './ActionController';
import { Args } from '../Common';
import { Task } from '../Storage/TaskQueue';
import { ActionError } from '../Errors';
import { getNumber } from '../utils';
@registerAction
export class GrabHeroAttributesAction extends ActionController {
@ -10,13 +11,11 @@ export class GrabHeroAttributesAction extends ActionController {
if (healthElement.length !== 1) {
throw new ActionError(task.id, 'Health dom element not found');
}
const text = healthElement.text();
let normalized = text.replace(/[^0-9]/g, '');
const value = Number(normalized);
if (isNaN(value)) {
throw new ActionError(task.id, `Health value "${text}" (${normalized}) couldn't be converted to number`);
}
const value = getNumber(normalized);
this.state.set('hero', { health: value });
}
}

View File

@ -0,0 +1,36 @@
import { ActionController, registerAction } from './ActionController';
import { Args } from '../Common';
import { Task } from '../Storage/TaskQueue';
import { getNumber } from '../utils';
import { ActionError } from '../Errors';
const LUMBER = 1;
const CLAY = 2;
const IRON = 3;
const CROP = 4;
@registerAction
export class GrabVillageResourcesAction extends ActionController {
async run(args: Args, task: Task): Promise<any> {
const lumber = this.grabResource(task, LUMBER);
const clay = this.grabResource(task, CLAY);
const iron = this.grabResource(task, IRON);
const crop = this.grabResource(task, CROP);
this.state.set('resources', { [LUMBER]: lumber, [CLAY]: clay, [IRON]: iron, [CROP]: crop });
}
private grabResource(task: Task, type: number): number {
const stockBarElement = jQuery('#stockBar');
if (stockBarElement.length !== 1) {
throw new ActionError(task.id, 'Stock Bar not found');
}
const resElement = stockBarElement.find(`#l${type}`);
if (resElement.length !== 1) {
throw new ActionError(task.id, `Resource #${type} not found`);
}
return getNumber(resElement.text().replace(/[^0-9]/g, ''));
}
}

View File

@ -22,7 +22,7 @@ export class TrainTrooperAction extends ActionController {
const maxCount = getNumber(countLink.text());
if (maxCount < trainCount) {
throw new TryLaterError(task.id, 10 * 60, `Max count ${maxCount} less then need ${trainCount}`);
throw new TryLaterError(task.id, 20 * 60, `Max count ${maxCount} less then need ${trainCount}`);
}
const input = block.find(`input[name="t${troopId}"]`);