84 lines
3.2 KiB
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();
|
|
}
|
|
}
|