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.entities.Character; import uulm.teamname.marvelous.gamelibrary.json.ingame.SerializedEntityType; import java.io.IOException; import java.util.Arrays; public class EntitySerializer extends StdSerializer { public EntitySerializer() { this(null); } protected EntitySerializer(Class t) { super(t); } @Override public void serialize(Entity value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); gen.writeObjectField("entityType", SerializedEntityType.valueOf(value.id.type)); if (value instanceof NPC) { System.out.println("instanceof NPC"); serializeNPC((NPC) value, gen, provider); } else if (value instanceof Character) { System.out.println("instanceof Chara"); serializeCharacter((Character) value, gen, provider); } else if (value instanceof Rock) { serializeRock((Rock) value, gen, provider); } else if (value instanceof InfinityStone) { serializeInfinityStone((InfinityStone) value, gen, provider); } gen.writeObjectField("position", value.getPosition()); gen.writeEndObject(); } private void serializeNPC(NPC value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumberField("ID", value.id.id); gen.writeNumberField("MP", value.mp.getValue()); gen.writeFieldName("stones"); gen.writeArray(inventoryToIntArray(value.inventory), 0, value.inventory.getSize()); } private void serializeCharacter(Character value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumberField("PID", value.id.type == EntityType.P1 ? 1 : 2); gen.writeNumberField("ID", value.id.id); gen.writeNumberField("HP", value.hp.getValue()); gen.writeNumberField("MP", value.mp.getValue()); gen.writeNumberField("AP", value.ap.getValue()); gen.writeFieldName("stones"); gen.writeArray( inventoryToIntArray(value.inventory), 0, value.inventory.getSize()); } private void serializeRock(Rock value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumberField("ID", value.id.id); gen.writeNumberField("HP", value.getHp()); } private void serializeInfinityStone(InfinityStone value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumberField("ID", value.id.id); } /** Returns an int[] with the sorted integer representations of the stones in the given Inventory */ private int[] inventoryToIntArray(Inventory inventory) { return Arrays.stream(inventory.getStonesAsArray()) .mapToInt(StoneType::getID) .sorted() .toArray(); } }