Gamelib/src/main/java/uulm/teamname/marvelous/gamelibrary/json/ingame/serialize/EntitySerializer.java

84 lines
3.2 KiB
Java

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<Entity> {
public EntitySerializer() {
this(null);
}
protected EntitySerializer(Class<Entity> 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();
}
}