From fae83c6beea39ad056398ef0f5c2665758142d3a Mon Sep 17 00:00:00 2001 From: cheezballs Date: Mon, 11 Dec 2023 18:34:06 -0600 Subject: [PATCH] Glad to see Macaulay Culkin is still alive and kickin. --- .../java/dev/indoors/ringrats/RingRats.java | 43 +++++++++--------- .../ringrats/serializer/JacksonConfig.java | 20 ++++----- .../serializer/MatchConfigDeserializer.java | 35 +++++++++++++++ .../serializer/StipulationDeserializer.java | 23 ---------- .../simulation/attribute/Attribute.java | 6 +-- .../core/comparator/InitiativeComparator.java | 2 +- .../ringrats/simulation/match/Match.java | 5 ++- .../simulation/match/MatchConfiguration.java | 12 +++-- .../stipulation/OneFallStipulation.java | 2 + .../ringrats/simulation/wrestler/Health.java | 8 ++++ .../simulation/wrestler/Wrestler.java | 1 + src/main/resources/examples/1v1-basic.json | 6 ++- .../service/SimulationServiceTests.java | 24 +++++++--- src/test/resources/1v1-basic.json | 44 +++++++++++++++++-- 14 files changed, 155 insertions(+), 76 deletions(-) create mode 100644 src/main/java/dev/indoors/ringrats/serializer/MatchConfigDeserializer.java delete mode 100644 src/main/java/dev/indoors/ringrats/serializer/StipulationDeserializer.java diff --git a/src/main/java/dev/indoors/ringrats/RingRats.java b/src/main/java/dev/indoors/ringrats/RingRats.java index a58fa67..b040113 100644 --- a/src/main/java/dev/indoors/ringrats/RingRats.java +++ b/src/main/java/dev/indoors/ringrats/RingRats.java @@ -14,27 +14,28 @@ @Slf4j public class RingRats implements CommandLineRunner { - @Autowired - ConfigurationService configService; - - @Autowired - SimulationService simulationService; - - public static void main(String[] args) { - SpringApplication.run(RingRats.class, args); - } - - @Override - public void run(String... args) { - configService.readCommandLineArguments(args); - try { - MatchConfiguration matchConfig = configService.buildMatchConfiguration(args); - simulationService.simulateMatch(matchConfig); - } catch (ArgumentException e) { - log.error(e.getMessage(), e); - } - - } + @Autowired + ConfigurationService configService; + + @Autowired + SimulationService simulationService; + + public static void main(String[] args) { + SpringApplication.run(RingRats.class, args); + } + + @Override + public void run(String... args) { + if (args.length > 0) { + configService.readCommandLineArguments(args); + try { + MatchConfiguration matchConfig = configService.buildMatchConfiguration(args); + simulationService.simulateMatch(matchConfig); + } catch (ArgumentException e) { + log.error(e.getMessage(), e); + } + } + } } diff --git a/src/main/java/dev/indoors/ringrats/serializer/JacksonConfig.java b/src/main/java/dev/indoors/ringrats/serializer/JacksonConfig.java index 7310c55..b570c92 100644 --- a/src/main/java/dev/indoors/ringrats/serializer/JacksonConfig.java +++ b/src/main/java/dev/indoors/ringrats/serializer/JacksonConfig.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; -import dev.indoors.ringrats.simulation.stipulation.Stipulation; +import dev.indoors.ringrats.simulation.match.MatchConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -10,13 +10,13 @@ @Configuration public class JacksonConfig { - @Bean - @Primary - public ObjectMapper objectMapper() { - ObjectMapper mapper = new ObjectMapper(); - SimpleModule module = new SimpleModule(); - module.addDeserializer(Stipulation.class, new StipulationDeserializer()); - mapper.registerModule(module); - return mapper; - } + @Bean + @Primary + public ObjectMapper objectMapper() { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule module = new SimpleModule(); + module.addDeserializer(MatchConfiguration.class, new MatchConfigDeserializer()); + mapper.registerModule(module); + return mapper; + } } diff --git a/src/main/java/dev/indoors/ringrats/serializer/MatchConfigDeserializer.java b/src/main/java/dev/indoors/ringrats/serializer/MatchConfigDeserializer.java new file mode 100644 index 0000000..cc2b593 --- /dev/null +++ b/src/main/java/dev/indoors/ringrats/serializer/MatchConfigDeserializer.java @@ -0,0 +1,35 @@ +package dev.indoors.ringrats.serializer; + +import com.fasterxml.jackson.core.JsonParser; +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 dev.indoors.ringrats.simulation.match.MatchConfiguration; +import dev.indoors.ringrats.simulation.stipulation.Stipulation; +import dev.indoors.ringrats.simulation.stipulation.StipulationFactory; +import dev.indoors.ringrats.simulation.wrestler.Wrestler; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +public class MatchConfigDeserializer extends JsonDeserializer { + + @Override + public MatchConfiguration deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + JsonNode root = jsonParser.getCodec().readTree(jsonParser); + ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec(); + + Set wrestlers = mapper.treeToValue(root.get("wrestlers"), mapper.getTypeFactory().constructCollectionType(HashSet.class, Wrestler.class)); + + Set stipulations = new HashSet<>(); + for (JsonNode stipNode : root.get("stipulations")) { + Stipulation stipulation = StipulationFactory.getStipulation(stipNode.get("name").asText()); + stipulations.add(stipulation); + } + + return new MatchConfiguration(stipulations, wrestlers); + } +} diff --git a/src/main/java/dev/indoors/ringrats/serializer/StipulationDeserializer.java b/src/main/java/dev/indoors/ringrats/serializer/StipulationDeserializer.java deleted file mode 100644 index a587dba..0000000 --- a/src/main/java/dev/indoors/ringrats/serializer/StipulationDeserializer.java +++ /dev/null @@ -1,23 +0,0 @@ -package dev.indoors.ringrats.serializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import dev.indoors.ringrats.simulation.stipulation.Stipulation; -import dev.indoors.ringrats.simulation.stipulation.StipulationFactory; - -import java.io.IOException; - -public class StipulationDeserializer extends JsonDeserializer { - - @Override - public Stipulation deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException { - - JsonNode node = jsonParser.getCodec().readTree(jsonParser); - String name = node.get("name").asText(); - - return StipulationFactory.getStipulation(name); - } -} diff --git a/src/main/java/dev/indoors/ringrats/simulation/attribute/Attribute.java b/src/main/java/dev/indoors/ringrats/simulation/attribute/Attribute.java index 886987b..88eb220 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/attribute/Attribute.java +++ b/src/main/java/dev/indoors/ringrats/simulation/attribute/Attribute.java @@ -1,12 +1,12 @@ package dev.indoors.ringrats.simulation.attribute; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; @Getter @Setter @NoArgsConstructor +@AllArgsConstructor +@Builder public class Attribute { private Integer beginningValue; diff --git a/src/main/java/dev/indoors/ringrats/simulation/core/comparator/InitiativeComparator.java b/src/main/java/dev/indoors/ringrats/simulation/core/comparator/InitiativeComparator.java index 0083fcf..33fb7f7 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/core/comparator/InitiativeComparator.java +++ b/src/main/java/dev/indoors/ringrats/simulation/core/comparator/InitiativeComparator.java @@ -8,6 +8,6 @@ public class InitiativeComparator implements Comparator { @Override public int compare(Wrestler w1, Wrestler w2) { - return Integer.compare(w1.calcInitiative(), w2.calcInitiative()); + return -Integer.compare(w1.calcInitiative(), w2.calcInitiative()); } } diff --git a/src/main/java/dev/indoors/ringrats/simulation/match/Match.java b/src/main/java/dev/indoors/ringrats/simulation/match/Match.java index cdc09c6..4dc5fd0 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/match/Match.java +++ b/src/main/java/dev/indoors/ringrats/simulation/match/Match.java @@ -46,7 +46,6 @@ public void start() { wrestler.initializeForSimulation(); // make the wrestler focus on one of the other wrestlers - // TODO: make this better and smarter, dont hit friendly wrestlers, etc Performer performer = findRandomOpponent(wrestler); wrestler.addTask(new FocusAttentionTask(performer)); } @@ -70,7 +69,9 @@ public MatchResults end() { } private Performer findRandomOpponent(Wrestler wrestler) { - List filteredWrestlers = wrestlers.stream().filter(w -> !w.getName().equals(wrestler.getName())).toList(); + List filteredWrestlers = wrestlers.stream().filter(w -> + !w.getName().equals(wrestler.getName()) && !w.getTeam().equalsIgnoreCase(wrestler.getTeam()) + ).toList(); Random random = new Random(); return filteredWrestlers.get(random.nextInt(filteredWrestlers.size())); } diff --git a/src/main/java/dev/indoors/ringrats/simulation/match/MatchConfiguration.java b/src/main/java/dev/indoors/ringrats/simulation/match/MatchConfiguration.java index ea1e8ba..4575097 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/match/MatchConfiguration.java +++ b/src/main/java/dev/indoors/ringrats/simulation/match/MatchConfiguration.java @@ -3,19 +3,23 @@ import com.fasterxml.jackson.annotation.JsonProperty; import dev.indoors.ringrats.simulation.stipulation.Stipulation; import dev.indoors.ringrats.simulation.wrestler.Wrestler; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.Set; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public class MatchConfiguration { - @JsonProperty() - Set stipulations; + @JsonProperty() + Set stipulations; - @JsonProperty() - Set wrestlers; + @JsonProperty() + Set wrestlers; } diff --git a/src/main/java/dev/indoors/ringrats/simulation/stipulation/OneFallStipulation.java b/src/main/java/dev/indoors/ringrats/simulation/stipulation/OneFallStipulation.java index 1e113e4..8caac8c 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/stipulation/OneFallStipulation.java +++ b/src/main/java/dev/indoors/ringrats/simulation/stipulation/OneFallStipulation.java @@ -2,6 +2,7 @@ import dev.indoors.ringrats.simulation.condition.Condition; import dev.indoors.ringrats.simulation.condition.StandingCondition; +import dev.indoors.ringrats.simulation.wrestler.Wrestler; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,6 +16,7 @@ public class OneFallStipulation extends Stipulation { private String name = "One Fall"; + private Set activeWrestlers; @Override public Set getStartingConditions() { diff --git a/src/main/java/dev/indoors/ringrats/simulation/wrestler/Health.java b/src/main/java/dev/indoors/ringrats/simulation/wrestler/Health.java index 9d48671..2ac76f4 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/wrestler/Health.java +++ b/src/main/java/dev/indoors/ringrats/simulation/wrestler/Health.java @@ -1,7 +1,15 @@ package dev.indoors.ringrats.simulation.wrestler; import dev.indoors.ringrats.simulation.attribute.Attribute; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor public class Health { Attribute head; diff --git a/src/main/java/dev/indoors/ringrats/simulation/wrestler/Wrestler.java b/src/main/java/dev/indoors/ringrats/simulation/wrestler/Wrestler.java index 1462e79..d09771b 100644 --- a/src/main/java/dev/indoors/ringrats/simulation/wrestler/Wrestler.java +++ b/src/main/java/dev/indoors/ringrats/simulation/wrestler/Wrestler.java @@ -17,6 +17,7 @@ public class Wrestler extends Performer { Attribute energy; Attribute stamina; Attribute quickness; + String team; public int calcInitiative() { int currQuickness = quickness.getCurrentValue(); diff --git a/src/main/resources/examples/1v1-basic.json b/src/main/resources/examples/1v1-basic.json index 617cdb9..22681ac 100644 --- a/src/main/resources/examples/1v1-basic.json +++ b/src/main/resources/examples/1v1-basic.json @@ -7,7 +7,8 @@ }, "quickness": { "beginningValue": 60 - } + }, + "team": "1" }, { "name": "Rufus", @@ -16,7 +17,8 @@ }, "quickness": { "beginningValue": 75 - } + }, + "team": "2" } ], "stipulations": [ diff --git a/src/test/java/dev/indoors/ringrats/service/SimulationServiceTests.java b/src/test/java/dev/indoors/ringrats/service/SimulationServiceTests.java index d0b577f..3548214 100644 --- a/src/test/java/dev/indoors/ringrats/service/SimulationServiceTests.java +++ b/src/test/java/dev/indoors/ringrats/service/SimulationServiceTests.java @@ -1,25 +1,37 @@ package dev.indoors.ringrats.service; +import com.fasterxml.jackson.databind.ObjectMapper; import dev.indoors.ringrats.service.impl.SimulationServiceImpl; +import dev.indoors.ringrats.simulation.match.MatchConfiguration; import dev.indoors.ringrats.simulation.match.MatchResults; -import dev.indoors.ringrats.util.MockMatchConfigurations; -import dev.indoors.ringrats.util.MockWrestlers; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; -@SpringBootTest(args = {"-f", "examples/1v1-basic.json"}) +@SpringBootTest public class SimulationServiceTests { @InjectMocks SimulationServiceImpl simService; + @Autowired + ObjectMapper mapper; + @Test - void firstTest() { - MatchResults results = simService.simulateMatch(MockMatchConfigurations.basicOneFall(MockWrestlers.create("Wang Chung", "Dangerous Davey"))); + void firstTest() throws IOException { + ClassPathResource resource = new ClassPathResource("1v1-basic.json"); + String json = new String(Files.readAllBytes(Paths.get(resource.getURI()))); + MatchConfiguration config = mapper.readValue(json, MatchConfiguration.class); + MatchResults results = simService.simulateMatch(config); assertThat(results).isNotNull(); } - + } diff --git a/src/test/resources/1v1-basic.json b/src/test/resources/1v1-basic.json index 7246d5b..955102c 100644 --- a/src/test/resources/1v1-basic.json +++ b/src/test/resources/1v1-basic.json @@ -6,8 +6,26 @@ "beginningValue": 100 }, "quickness": { - "beginningValue": 100 - } + "beginningValue": 60 + }, + "health": { + "head": { + "beginningValue": 60 + }, + "arm": { + "beginningValue": 60 + }, + "leg": { + "beginningValue": 60 + }, + "back": { + "beginningValue": 60 + }, + "core": { + "beginningValue": 60 + } + }, + "team": "1" }, { "name": "Rufus", @@ -15,8 +33,26 @@ "beginningValue": 100 }, "quickness": { - "beginningValue": 100 - } + "beginningValue": 75 + }, + "health": { + "head": { + "beginningValue": 70 + }, + "arm": { + "beginningValue": 40 + }, + "leg": { + "beginningValue": 70 + }, + "back": { + "beginningValue": 60 + }, + "core": { + "beginningValue": 59 + } + }, + "team": "2" } ], "stipulations": [