feat: completed EventSerializer

This commit is contained in:
Yannik Bretschneider 2021-06-02 00:34:51 +02:00
parent f184c6b3b9
commit ea6a178c82

View File

@ -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<Event> {
public EventSerializer() {
this(null);
}
protected EventSerializer(Class<Event> 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();
}
}