diff --git a/src/main/java/com/epita/creeps/Program.java b/src/main/java/com/epita/creeps/Program.java index 1a881ef..18c05f1 100644 --- a/src/main/java/com/epita/creeps/Program.java +++ b/src/main/java/com/epita/creeps/Program.java @@ -1,29 +1,22 @@ package com.epita.creeps; import com.epita.creeps.commands.Basics; -import com.epita.creeps.given.extra.Cartographer; import com.epita.creeps.given.vo.geometry.Direction; -import com.epita.creeps.given.vo.geometry.Point; import com.epita.creeps.given.vo.response.CommandResponse; import com.epita.creeps.given.vo.response.InitResponse; -import com.epita.creeps.given.vo.response.StatisticsResponse; -import com.epita.creeps.units.*; +import com.epita.creeps.units.Building; +import com.epita.creeps.units.Citizen; import kong.unirest.core.HttpResponse; import kong.unirest.core.JsonNode; import kong.unirest.core.Unirest; import kong.unirest.core.UnirestException; -import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; - public class Program { private static String srvUrl; private static Logger logger; - @Getter private static String login; public static void main(String[] args) { @@ -61,6 +54,7 @@ public class Program { logger.error("Cannot connect to the server. Aborting..."); throw e; } +// AsyncExec.justWait(0); // Create account and get init infos logger.info("Creating account"); @@ -68,16 +62,54 @@ public class Program { login = initResponse.login; // Just in case AsyncExec.setTicksPerSecond((float) initResponse.setup.ticksPerSeconds); - Citizen citizen1 = new Citizen(login, initResponse.citizen1Id, initResponse.householdCoordinates); - Citizen citizen2 = new Citizen(login, initResponse.citizen2Id, initResponse.householdCoordinates); - Unit.getUnits().add(citizen1); - Unit.getUnits().add(citizen2); + Citizen citizen1 = new Citizen(login, initResponse.citizen1Id); + Citizen citizen2 = new Citizen(login, initResponse.citizen2Id); - // Et voilĂ , machtou pichtou + citizen1.move(Direction.UP).waitFinished(); + + while (true) { + citizen1.move(Direction.UP); + citizen2.move(Direction.RIGHT); + + citizen1.waitFinished(); + citizen2.waitFinished(); + + citizen1.build(Building.ROAD); + citizen2.gather(); + + citizen1.waitFinished(); + citizen2.waitFinished(); + } - logger.info("Done"); + +// logger.info("Done"); } +// ### Get statistics +//GET http://localhost:1664/statistics +// +//### Get status +//GET http://localhost:1664/status +// +//### Get report +//GET http://localhost:1664/report/148997e9b +// +//### Login with user login_l +//POST http://localhost:1664/init/login_l +// +//> {% +//client.global.set("baseId", response.body.baseId); +//client.global.set("probeId", response.body.probeId); +//client.global.set("login", response.body.login); +//%} +// +//### Post noop commande +//POST http://localhost:1664/command/{{login}}/{{probeId}}/noop +// +//### +//POST http://localhost:1664/command/dumeig_a/8d87eea10/inspect +// +//### } diff --git a/src/main/java/com/epita/creeps/commands/Basics.java b/src/main/java/com/epita/creeps/commands/Basics.java index 070fab9..7a21963 100644 --- a/src/main/java/com/epita/creeps/commands/Basics.java +++ b/src/main/java/com/epita/creeps/commands/Basics.java @@ -1,16 +1,10 @@ package com.epita.creeps.commands; import com.epita.creeps.AsyncExec; -import com.epita.creeps.Program; import com.epita.creeps.given.exception.NoReportException; -import com.epita.creeps.given.extra.Cartographer; import com.epita.creeps.given.json.Json; -import com.epita.creeps.given.vo.report.*; +import com.epita.creeps.given.vo.report.Report; import com.epita.creeps.given.vo.response.InitResponse; -import com.epita.creeps.given.vo.response.StatisticsResponse; -import com.epita.creeps.units.BomberBot; -import com.epita.creeps.units.Turret; -import com.epita.creeps.units.Unit; import kong.unirest.core.HttpResponse; import kong.unirest.core.JsonNode; import kong.unirest.core.Unirest; @@ -52,78 +46,20 @@ public class Basics { } } - - public static StatisticsResponse getStatistics() { - try { - CompletableFuture> resp = AsyncExec.asyncExec(() -> Unirest.get(srvUrl + "/statistics").asJson(), 0); - HttpResponse response = resp.join(); - return Json.parse(response.getBody().toString(), StatisticsResponse.class); - } catch (UnirestException e) { - logger.error("Cannot retrieve statistics."); - throw e; - } - } - // Asks the server for a certain report public static Report getReport (String reportId) { - HttpResponse response = null; + HttpResponse response; try { response = Unirest.get(srvUrl + "/report/" + reportId).asJson(); -// logger.debug("Got report: " + response.getBody().toPrettyString()); - Report report = Json.parseReport(response.getBody().toString()); - handleReport(report); - return report; + logger.debug("Got report: " + response.getBody().toPrettyString()); + return Json.parseReport(response.getBody().toString()); } catch (UnirestException e) { logger.error("Could not retrieve report"); throw new RuntimeException(e); } catch (NoReportException e) { logger.error("Could not parse report: not a report"); - logger.debug(response.getBody().toPrettyString()); throw new RuntimeException(e); } } - public static void handleReport(Report report) { - Cartographer c = Cartographer.INSTANCE; - if (report.opcode.startsWith("farm")) { - c.register((FarmReport) report); - } - else if (report.opcode.startsWith("gather")) { - c.register((GatherReport) report); - } - else if (report.opcode.startsWith("move")) { - c.register((MoveReport) report); - } - else if (report.opcode.startsWith("build")) { - c.register((BuildReport) report); - } - else if (report.opcode.startsWith("observe")) { - c.register((ObserveReport) report); - } - else if (report.opcode.startsWith("spawn")) - { - SpawnReport spawnReport = (SpawnReport) report; - if (spawnReport.errorCode != null) { - logger.warn("Could not spawn unit: got report with an error: " + report.errorCode); - } - if (spawnReport.spawnedUnit.opcode.endsWith("turret")) { - Turret turret = new Turret(Program.getLogin(), spawnReport.spawnedUnitId, spawnReport.spawnedUnit.position); - Unit.getUnits().add(turret); - } - else if (spawnReport.spawnedUnit.opcode.endsWith("bomber-bot")) { - BomberBot bombhero = new BomberBot(Program.getLogin(), spawnReport.spawnedUnitId, spawnReport.spawnedUnit.position); - Unit.getUnits().add(bombhero); - } - else { - logger.warn("Spawned unit is an unknown type. Ignored..."); - } - } - else if (report.opcode.startsWith("fire")) { - logger.debug("FIRREEE!!"); - } - else { - logger.warn("Unknown opcode '" + report.opcode + "' in the server report. Ignored..."); - } - } - } diff --git a/src/main/java/com/epita/creeps/commands/ObeserveReport.java b/src/main/java/com/epita/creeps/commands/ObeserveReport.java deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/epita/creeps/units/BomberBot.java b/src/main/java/com/epita/creeps/units/BomberBot.java deleted file mode 100644 index c499dea..0000000 --- a/src/main/java/com/epita/creeps/units/BomberBot.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.epita.creeps.units; - -import com.epita.creeps.given.extra.Cartographer; -import com.epita.creeps.given.json.Json; -import com.epita.creeps.given.vo.geometry.Point; -import com.epita.creeps.given.vo.parameter.FireParameter; - -import java.util.List; - -public class BomberBot extends Unit { - - public BomberBot(String login, String id, Point position) { - super(login, id, position); - } - - // Retrieves all units that are turrets - public static List getBomberBotUnits() { - return getUnits().stream().filter(unit -> unit.getClass() == BomberBot.class).toList(); - } - - public BomberBot fire() { - FireParameter fp = new FireParameter(this.position); - sendActionWithBody("fire:bomber-bot", Json.serialize(fp), 2); - return this; - } -} diff --git a/src/main/java/com/epita/creeps/units/Citizen.java b/src/main/java/com/epita/creeps/units/Citizen.java index 6d2b4a5..a5e1c0d 100644 --- a/src/main/java/com/epita/creeps/units/Citizen.java +++ b/src/main/java/com/epita/creeps/units/Citizen.java @@ -6,7 +6,6 @@ import com.epita.creeps.commands.Basics; import com.epita.creeps.given.exception.NoReportException; import com.epita.creeps.given.json.Json; import com.epita.creeps.given.vo.geometry.Direction; -import com.epita.creeps.given.vo.geometry.Point; import com.epita.creeps.given.vo.parameter.MessageParameter; import com.epita.creeps.given.vo.report.MoveReport; import com.epita.creeps.given.vo.report.Report; @@ -20,8 +19,8 @@ import java.util.concurrent.CompletableFuture; public class Citizen extends Unit { - public Citizen(String login, String citizen_id, Point position) { - super(login, citizen_id, position); + public Citizen(String login, String citizen_id ) { + super(login, citizen_id); } public Citizen move(Direction direction) { diff --git a/src/main/java/com/epita/creeps/units/Turret.java b/src/main/java/com/epita/creeps/units/Turret.java deleted file mode 100644 index f2ba638..0000000 --- a/src/main/java/com/epita/creeps/units/Turret.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.epita.creeps.units; - -import com.epita.creeps.given.extra.Cartographer; -import com.epita.creeps.given.json.Json; -import com.epita.creeps.given.vo.geometry.Point; -import com.epita.creeps.given.vo.parameter.FireParameter; - -import java.util.List; - -public class Turret extends Unit { - - public Turret(String login, String id, Point position) { - super(login, id, position); - } - - // Retrieves all units that are turrets - public static List getTurretUnits() { - return getUnits().stream().filter(unit -> unit.getClass() == Turret.class).toList(); - } - - public Turret fire(Point target) { - FireParameter fp = new FireParameter(target); - Cartographer cartographer = Cartographer.INSTANCE; - sendActionWithBody("fire:turret", Json.serialize(fp), 2); - return this; - } -} diff --git a/src/main/java/com/epita/creeps/units/Unit.java b/src/main/java/com/epita/creeps/units/Unit.java index d508fa4..6ba8cd8 100644 --- a/src/main/java/com/epita/creeps/units/Unit.java +++ b/src/main/java/com/epita/creeps/units/Unit.java @@ -4,55 +4,41 @@ import com.epita.creeps.AsyncExec; import com.epita.creeps.ServerReponseException; import com.epita.creeps.commands.Basics; import com.epita.creeps.given.json.Json; -import com.epita.creeps.given.vo.geometry.Point; import com.epita.creeps.given.vo.report.Report; import com.epita.creeps.given.vo.response.CommandResponse; import kong.unirest.core.HttpResponse; import kong.unirest.core.JsonNode; import kong.unirest.core.Unirest; -import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.CompletableFuture; public abstract class Unit { - @Getter - private static final List units = new ArrayList<>(); public static String srvUrl; public static final Logger logger = LoggerFactory.getLogger(Unit.class); protected final String id; - @Getter - protected final Point position; protected final String command_uri; protected CompletableFuture> pendingAction; protected CompletableFuture pendingReport; protected Report lastReport; - protected boolean idle = true; - public Unit(String login, String id, Point position) { + + public Unit(String login, String id) { if (srvUrl == null) { throw new RuntimeException("Tried to create a citizen without properly initializing static fields"); } this.id = id; - this.position = position; command_uri = srvUrl + "/command/" + login + "/" + id + "/"; } // Sends a specific action to the server using it's HTTPS string representation // Sets pending action accordingly and asks for a report after `delay` ticks public void sendActionWithBody(String actionCode, String body, long delay) { - if (!idle) { -// logger.warn("Unit is already busy, queuing action"); - this.waitFinished(); - } - // Do - idle = false; - pendingAction = AsyncExec.asyncExec(() -> Unirest.post(command_uri + actionCode).body(body).asJson(), delay) + // Move + pendingAction = AsyncExec.asyncExec(() -> Unirest.post(command_uri + actionCode).asJson(), delay) .thenApplyAsync( x -> x ); // Get report pendingReport = getCommandReport(); @@ -74,10 +60,6 @@ public abstract class Unit { * @return true if action succeeded, false otherwise */ public boolean waitFinished() { - if (idle) { - logger.warn("Tried to wait for an idle citizen"); - return false; - } if (pendingAction == null || pendingReport == null) { logger.warn("Tried to wait a citizen with no pending action or report"); return false; @@ -87,8 +69,7 @@ public abstract class Unit { logger.warn("Invalid report received: null value"); return false; } -// logger.debug("Got report: " + lastReport); - idle = true; + logger.debug("Got report: " + lastReport); return lastReport.errorCode != null; } @@ -102,10 +83,8 @@ public abstract class Unit { } return AsyncExec.thenAsyncExec(pendingAction, x -> { CommandResponse cr = Json.parse(x.getBody().toString(), CommandResponse.class); - if (cr.error != null) { - logger.debug("Server reponse: " + cr.toString()); + if (cr.error != null) throw new ServerReponseException("Error retrieving the report id"); - } String reportId = cr.reportId; return Basics.getReport(reportId); }, 0);