diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
| commit | c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch) | |
| tree | 3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/java/nucBattle/src | |
add: graphs et rushs
Diffstat (limited to 'graphs/java/nucBattle/src')
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 + } + } + ] + } +} |
