From ea6a178c826c93230a9f1470165ca446135c192c Mon Sep 17 00:00:00 2001 From: Yannik Bretschneider Date: Wed, 2 Jun 2021 00:34:51 +0200 Subject: [PATCH] feat: completed EventSerializer --- .../ingame/serialize/EventSerializer.java | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/main/java/uulm/teamname/marvelous/gamelibrary/json/ingame/serialize/EventSerializer.java diff --git a/src/main/java/uulm/teamname/marvelous/gamelibrary/json/ingame/serialize/EventSerializer.java b/src/main/java/uulm/teamname/marvelous/gamelibrary/json/ingame/serialize/EventSerializer.java new file mode 100644 index 0000000..cf84c94 --- /dev/null +++ b/src/main/java/uulm/teamname/marvelous/gamelibrary/json/ingame/serialize/EventSerializer.java @@ -0,0 +1,156 @@ +package uulm.teamname.marvelous.gamelibrary.json.ingame.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import uulm.teamname.marvelous.gamelibrary.entities.*; +import uulm.teamname.marvelous.gamelibrary.events.*; + +import java.io.IOException; +import java.util.Arrays; + +public class EventSerializer extends StdSerializer { + + public EventSerializer() { + this(null); + } + + protected EventSerializer(Class t) { + super(t); + } + + @Override + public void serialize(Event value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + gen.writeObjectField("eventType", value.type); + + if (value instanceof GamestateEvent) { + serializeGamestateEvent((GamestateEvent) value, gen, provider); + } else if (value instanceof EntityEvent) { + serializeEntityEvent((EntityEvent) value, gen, provider); + } else if (value instanceof CharacterEvent) { + serializeCharacterEvent((CharacterEvent) value, gen, provider); + } else if (value instanceof GameEvent) { + serializeGameEvent((GameEvent) value, gen, provider); + } else if (value instanceof CustomEvent) { + serializeCustomEvent((CustomEvent) value, gen, provider); + } + + gen.writeEndObject(); + } + + private void serializeGamestateEvent( + GamestateEvent value, + JsonGenerator gen, + SerializerProvider provider) + throws IOException { + + // Ack and Nack don't need anything more, and are technically gamestateEvents, so this if is here + if (value.type.equals(EventType.GamestateEvent)) { + gen.writeArrayFieldStart("entities"); + for (Entity entity : value.entities) { + gen.writeObject(entity); + } + gen.writeEndArray(); + + gen.writeObjectField("mapSize", value.mapSize); + + gen.writeArrayFieldStart("turnOrder"); + for (EntityID id : value.turnOrder) { + gen.writeObject(id); + } + + gen.writeObjectField("activeCharacter", value.activeCharacter); + + gen.writeFieldName("stoneCooldowns"); + gen.writeArray( + Arrays.stream(value.stoneCooldowns).mapToInt(x -> x).toArray(), + 0, + value.stoneCooldowns.length); + + gen.writeBooleanField("winCondition", value.winCondition); + } + } + + private void serializeEntityEvent( + EntityEvent value, + JsonGenerator gen, + SerializerProvider provider) + throws IOException { + if (value.type == EventType.SpawnEntityEvent) { + gen.writeObjectField("entity", value.entity); + } else { + gen.writeObjectField("targetEntity", value.targetEntity); + gen.writeObjectField("targetField", value.targetField); + + if (value.type != EventType.DestroyedEntityEvent) { + // a EntityDestroyedEvent doesn't have an Amount, but everything else does + gen.writeNumberField("amount", value.amount); + } + } + } + + private void serializeCharacterEvent( + CharacterEvent value, + JsonGenerator gen, + SerializerProvider provider) + throws IOException { + gen.writeObjectField("originEntity", value.originEntity); + gen.writeObjectField("targetEntity", value.targetEntity); + gen.writeObjectField("originField", value.originField); + gen.writeObjectField("targetField", value.targetField); + + if (value.type == EventType.UseInfinityStoneEvent || value.type == EventType.ExchangeInfinityStoneEvent) { + gen.writeObject(new EntityID(EntityType.InfinityStones, value.stoneType.getID())); + } + } + + private void serializeGameEvent( + GameEvent value, + JsonGenerator gen, + SerializerProvider provider) + throws IOException { + switch (value.type) { + case RoundSetupEvent -> { + gen.writeNumberField("roundCount", value.roundCount); + gen.writeFieldName("characterOrder"); + for (EntityID id : value.characterOrder) { + gen.writeObject(id); + } + gen.writeEndArray(); + } + case TurnEvent -> { + gen.writeNumberField("turnCount", value.turnCount); + gen.writeObjectField("nextCharacter", value.nextCharacter); + } + case WinEvent -> { + gen.writeNumberField("playerWon", value.playerWon); + } + case TimeoutWarningEvent -> { + gen.writeStringField("message", value.message); + gen.writeNumberField("timeLeft", value.timeLeft); + } + case TimeoutEvent -> { + gen.writeStringField("message", value.message); + } + default -> { /* do nothing, as all other events don't need any additional keys/values */} + } + } + + private void serializeCustomEvent( + CustomEvent value, + JsonGenerator gen, + SerializerProvider provider) + throws IOException { + gen.writeStringField("teamIdentifier", value.teamIdentifier); + gen.writeObjectField("customContent", value.customContent); + } + + + private int[] inventoryToIntArray(Inventory inventory) { + return Arrays.stream(inventory.getStonesAsArray()) + .mapToInt(StoneType::getID) + .sorted() + .toArray(); + } +}