summaryrefslogtreecommitdiff
path: root/graphs/java/nucBattle/src/main
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/java/nucBattle/src/main
add: graphs et rushs
Diffstat (limited to 'graphs/java/nucBattle/src/main')
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java101
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java20
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java20
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java14
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java30
-rw-r--r--graphs/java/nucBattle/src/main/resources/exampleBattle1.json66
9 files changed, 305 insertions, 0 deletions
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java
new file mode 100644
index 0000000..35a9b3e
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Battle {
+ @JsonProperty("battle_id")
+ private int battleId;
+
+ private List<Turn> turns;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java
new file mode 100644
index 0000000..57d7dcc
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java
@@ -0,0 +1,101 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+public class BattleManager {
+ String input;
+ private Map<String, Nuc> nucs;
+ private Battle battle;
+
+ public BattleManager(String input) {
+ this.input = input;
+ }
+
+ public void computeBattle(String reportPath) {
+ Report report = new Report();
+ try (Stream<String> stream = Files.lines(Paths.get(input))) {
+ String jsonString = stream.reduce("", (s1, s2) -> s1 + s2);
+ ObjectMapper om = new ObjectMapper();
+ JsonNode jn = om.readTree(jsonString);
+ if (jn == null || jn.isNull()) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ }
+ nucs = om.readValue(jn.get("NUCs").toString(), new TypeReference<Map<String, Nuc>>() {
+ });
+
+ SimpleModule mod = new SimpleModule();
+ mod.addDeserializer(Turn.class, new TurnDeserializer(nucs));
+ om.registerModule(mod);
+ battle = om.readValue(jn.get("battle").toString(), Battle.class);
+ // winner pre-check
+ for (String t : nucs.keySet()) {
+ if (nucs.keySet().stream().filter(login -> !t.equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) {
+ report.setType(ReportType.WINNER);
+ report.setPlayer(t);
+ exportReport(reportPath, report);
+ return;
+ }
+ nucs.computeIfPresent(t, (k, tmp) -> new Nuc(tmp.getName(), Math.clamp(tmp.getHp(), 0, 100), tmp.getInstalledPrograms()));
+ }
+ for (Turn t : battle.getTurns()) {
+ if (nucs.get(t.getPlayerLogin()) == null || nucs.get(t.getTargetLogin()) == null) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ return;
+ }
+ // cheater check
+ if (!t.getPlayerNuc().getInstalledPrograms().containsAll(t.getPacket().getUsedPrograms())) {
+ report.setType(ReportType.CHEATER);
+ report.setPlayer(t.getPlayerLogin());
+ exportReport(reportPath, report);
+ return;
+ }
+ // swap nukes to update damage
+ Nuc n = nucs.get(t.getTargetLogin());
+ Nuc tmp = new Nuc(n.getName(), Math.clamp(n.getHp() - t.getPacket().getDamage(), 0, 100),
+ n.getInstalledPrograms());
+ nucs.put(t.getTargetLogin(), tmp);
+
+ // winner check
+ if (nucs.keySet().stream().filter(login -> !t.getPlayerLogin().equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) {
+ report.setType(ReportType.WINNER);
+ report.setPlayer(t.getPlayerLogin());
+ exportReport(reportPath, report);
+ return;
+ }
+ }
+ report.setType(ReportType.UNFINISHED);
+ exportReport(reportPath, report);
+ } catch (IOException e) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ }
+ }
+
+ private void exportReport(String reportPath, Report report) {
+ if (report.getType() != ReportType.ERROR && report.getType() != ReportType.CHEATER) {
+ report.outcome = new HashMap<>();
+ for (String login : nucs.keySet()) {
+ report.outcome.put(login, nucs.get(login).getHp());
+ }
+ }
+ ObjectMapper om = new ObjectMapper();
+ try {
+ om.writeValue(new File(reportPath), report);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java
new file mode 100644
index 0000000..e2e4a48
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java
@@ -0,0 +1,20 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Nuc {
+ private String name;
+
+ private float hp;
+
+ @JsonProperty("installed_programs")
+ private List<String> installedPrograms;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java
new file mode 100644
index 0000000..e8806f7
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java
@@ -0,0 +1,20 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Packet {
+ @JsonProperty("used_programs")
+ private List<String> usedPrograms;
+
+ private String command;
+
+ private float damage;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java
new file mode 100644
index 0000000..56aa10d
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Map;
+
+@NoArgsConstructor
+@Getter
+@Setter
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Report {
+ ReportType type = ReportType.UNFINISHED;
+ String player = null;
+ Map<String, Float> outcome = null;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java
new file mode 100644
index 0000000..c643c1b
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java
@@ -0,0 +1,14 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+public enum ReportType {
+ @JsonProperty("winner")
+ WINNER,
+ @JsonProperty("cheater")
+ CHEATER,
+ @JsonProperty("error")
+ ERROR,
+ @JsonProperty("unfinished")
+ UNFINISHED;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java
new file mode 100644
index 0000000..57e44dc
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public class Turn {
+ private Nuc playerNuc;
+ private String playerLogin;
+
+ private Nuc targetNuc;
+ private String targetLogin;
+
+ private Packet packet;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java
new file mode 100644
index 0000000..bfd60ba
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java
@@ -0,0 +1,30 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class TurnDeserializer extends JsonDeserializer<Turn> {
+ public TurnDeserializer(Map<String, Nuc> nucs) {
+ this.nucs = nucs;
+ }
+
+ Map<String, Nuc> nucs;
+ @Override
+ public Turn deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
+ JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+ String player_login = node.get("player_login").asText();
+ String target_login = node.get("target_login").asText();
+
+ final ObjectMapper om = new ObjectMapper();
+ Packet packet = om.readValue(node.get("packet").toString(), Packet.class);
+ return new Turn(nucs.get(player_login), player_login, nucs.get(target_login), target_login, packet);
+ }
+}
diff --git a/graphs/java/nucBattle/src/main/resources/exampleBattle1.json b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json
new file mode 100644
index 0000000..3d541dd
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json
@@ -0,0 +1,66 @@
+{
+ "NUCs": {
+ "xavier.login": {
+ "name": "r01p02",
+ "hp": 50.0,
+ "installed_programs": [
+ "yes",
+ "grep",
+ "pkill",
+ "ping",
+ "bash"
+ ]
+ },
+ "xavier.login2": {
+ "name": "r04p03",
+ "hp": 72.0,
+ "installed_programs": [
+ "find",
+ "cp",
+ "bash",
+ "wget"
+ ]
+ }
+ },
+ "battle": {
+ "battle_id": 9876,
+ "turns": [
+ {
+ "player_login": "xavier.prout",
+ "target_login": "xavier.login2",
+ "packet": {
+ "used_programs": [
+ "bash",
+ "yes"
+ ],
+ "command": "yes > ~/y",
+ "damage": 51.0
+ }
+ },
+ {
+ "player_login": "xavier.login2",
+ "target_login": "xavier.login",
+ "packet": {
+ "used_programs": [
+ "bash",
+ "cp",
+ "find"
+ ],
+ "command": "find / -type f -exec cp {} /tmp/ \\;",
+ "damage": 21.0
+ }
+ },
+ {
+ "player_login": "xavier.login",
+ "target_login": "xavier.login2",
+ "packet": {
+ "used_programs": [
+ "bash"
+ ],
+ "command": ":(){:|: &};:",
+ "damage": 32.0
+ }
+ }
+ ]
+ }
+}