package it.paspiz85.nanobot.logic;
import it.paspiz85.nanobot.exception.BotException;
import it.paspiz85.nanobot.game.Screen;
import it.paspiz85.nanobot.platform.Platform;
import java.util.concurrent.TimeoutException;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* State in which bot can be.
*
* @author paspiz85
*
* @param <S>
* screen to grab info.
*/
public abstract class State<S extends Screen> {
protected final Logger logger = Logger.getLogger(getClass().getName());
private final S screen;
protected final Platform platform = Platform.instance();
State(final S screen) {
this.screen = screen;
}
public final S getScreen() {
return screen;
}
public abstract void handle(Context context) throws BotException, InterruptedException;
protected final void sleepUntil(final Supplier<Boolean> supplier) throws InterruptedException, TimeoutException {
logger.log(Level.FINER, "Waiting for point");
for (int i = 0; i < 100; i++) {
if (supplier.get()) {
return;
}
logger.log(Level.FINER, "Point not found");
platform.sleepRandom(500);
}
throw new TimeoutException("Point not found");
}
}