package it.paspiz85.nanobot.logic; import it.paspiz85.nanobot.exception.BotConfigurationException; import it.paspiz85.nanobot.game.MainScreen; import it.paspiz85.nanobot.game.ManageTroopsScreen; import it.paspiz85.nanobot.game.Screen; import it.paspiz85.nanobot.scripting.ScriptManager; import it.paspiz85.nanobot.util.Point; import it.paspiz85.nanobot.util.Settings; import it.paspiz85.nanobot.util.Utils; import java.util.Collections; import java.util.function.Supplier; import java.util.logging.Level; /** * This state is when bot is in main menu. * * @author paspiz85 * */ public final class StateMainMenu extends State<MainScreen> { public static StateMainMenu instance() { return Utils.singleton(StateMainMenu.class, () -> new StateMainMenu()); } private StateMainMenu() { super(Screen.getInstance(MainScreen.class)); } private void collect(final String resource, final Supplier<Point> pointSearch) throws InterruptedException { platform.zoomUp(); platform.sleepRandom(350); logger.log(Level.INFO, String.format("Searching full collectors of %s...", resource)); int count = 0; while (true) { final Point p = pointSearch.get(); if (p == null) { logger.log(Level.INFO, String.format("Found %d full collectors of %s", count, resource)); return; } platform.leftClick(p, false); platform.sleepRandom(200); count++; } } private void collecting(final Context context) throws InterruptedException { if (context.getTrainCount() % 20 == 1) { collect("gold", () -> getScreen().searchFullGoldMine()); } if (context.getTrainCount() % 20 == 2) { collect("elisir", () -> getScreen().searchFullElixirCollector()); } if (context.getTrainCount() % 20 == 3) { collect("dark elisir", () -> getScreen().searchFullDarkElixirDrill()); } } private void extra(final Context context) throws InterruptedException { try { ScriptManager.instance().run("_loop.js", Collections.singletonMap("context", context)); } catch (final InterruptedException ex) { throw ex; } catch (final IllegalArgumentException ex) { logger.log(Level.FINE, ex.getMessage()); } catch (final Exception ex) { logger.log(Level.WARNING, "Error in extra script execution", ex); } } @Override public void handle(final Context context) throws BotConfigurationException, InterruptedException { logger.log(Level.FINE, "Returned in main menu"); if (Thread.interrupted()) { throw new InterruptedException(getClass().getSimpleName() + " is interrupted"); } if (Settings.instance().isCollectResources()) { collecting(context); } if (Settings.instance().isExtraFunctions()) { extra(context); } if (Screen.getInstance(ManageTroopsScreen.class).isDisplayed()) { logger.log(Level.FINE, "Close previous train"); platform.leftClick(Screen.getInstance(ManageTroopsScreen.class).getButtonTrainClose(), true); platform.sleepRandom(500); } logger.log(Level.FINE, "Open troops"); platform.leftClick(getScreen().getButtonTroops(), true); platform.sleepRandom(500); context.setState(StateManageTroops.instance()); } public void handleAttack(final Context context) throws InterruptedException { platform.zoomUp(); logger.log(Level.FINE, "Press Attack"); platform.leftClick(getScreen().getButtonAttack(), true); platform.sleepRandom(1000); context.setState(StateBattleBegin.instance()); } public void postMessage(final String message) throws InterruptedException { postMessage(message, false); } public void postMessage(final String message, final boolean clan) throws InterruptedException { platform.leftClick(new Point(18, 348), true); platform.sleepRandom(1000); if (clan) { platform.leftClick(new Point(223, 23), true); platform.sleepRandom(200); } else { platform.leftClick(new Point(76, 23), true); platform.sleepRandom(200); } platform.leftClick(new Point(18, 63), true); platform.sleepRandom(200); platform.write(message); logger.info("Posted message '" + message + "'"); platform.leftClick(new Point(282, 62), true); platform.sleepRandom(200); platform.leftClick(new Point(332, 353), true); platform.sleepRandom(1000); } }