package it.paspiz85.nanobot.logic; import it.paspiz85.nanobot.attack.Attack; import it.paspiz85.nanobot.game.ManageTroopsScreen; import it.paspiz85.nanobot.game.Screen; import it.paspiz85.nanobot.game.Troop; import it.paspiz85.nanobot.game.TroopsInfo; import it.paspiz85.nanobot.util.Settings; import it.paspiz85.nanobot.util.Utils; import java.util.logging.Level; /** * This state is when training troops. * * @author paspiz85 * */ public final class StateManageTroops extends State<ManageTroopsScreen> { public static StateManageTroops instance() { return Utils.singleton(StateManageTroops.class, () -> new StateManageTroops()); } private StateManageTroops() { super(Screen.getInstance(ManageTroopsScreen.class)); } @Override public void handle(final Context context) throws InterruptedException { logger.log(Level.FINE, "Managing troops"); if (Thread.interrupted()) { throw new InterruptedException(getClass().getSimpleName() + " is interrupted."); } final TroopsInfo troopsInfo = getScreen().parseTroopsInfo(); context.setTroopsInfo(troopsInfo); logger.log(Level.CONFIG, "Troops count: " + troopsInfo); logger.log(Level.FINE, "Open first barrack"); platform.leftClick(getScreen().getButtonTrainNext(), true); platform.sleepRandom(500); final int trainMaxTroops = Settings.instance().getTrainMaxTroops(); logger.log(Level.FINE, "Train Max Troops is " + trainMaxTroops); final int troopsCountSum = troopsInfo.getTroopsCountSum(); if ((getScreen().areCampsFull() || troopsCountSum >= trainMaxTroops) && !Attack.noStrategy().equals(Settings.instance().getAttackStrategy())) { logger.log(Level.INFO, "Camp is full"); logger.log(Level.FINE, "Close barracks"); platform.leftClick(getScreen().getButtonTrainClose(), true); platform.sleepRandom(200); StateMainMenu.instance().handleAttack(context); } else { if (trainMaxTroops > 0) { logger.log(Level.CONFIG, "Training Troops"); final Troop[] raxInfo = Settings.instance().getRaxInfo(); for (int currRax = 0; currRax < raxInfo.length; currRax++) { final Troop troop = raxInfo[currRax]; if (troop != Troop.NO_UNIT) { final int clicks = 10 + Utils.RANDOM.nextInt(10); logger.log(Level.FINE, "Try training " + clicks + " " + troop.getDescription()); for (int i = 0; i < clicks; i++) { platform.leftClick(troop.getTrainButton(), true); platform.sleepRandom(75); } } if (currRax < raxInfo.length - 1) { logger.log(Level.FINE, "Goto next barrack"); platform.leftClick(getScreen().getButtonTrainNext(), true); platform.sleepRandom(350); } } } StateManageTroopsEnd.instance().handle(context); // waiting minimum time platform.sleepRandom(Math.max(5000, 40000 - 5000 * context.getTrainCount())); } platform.sleepRandom(500); } }