package net.demilich.metastone.game.spells.desc.trigger; import java.lang.reflect.Type; import java.util.Map; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.demilich.metastone.game.cards.desc.ParseUtils; import net.demilich.metastone.game.cards.desc.ParseValueType; import net.demilich.metastone.game.spells.trigger.GameEventTrigger; public class EventTriggerDeserializer implements JsonDeserializer<EventTriggerDesc> { @SuppressWarnings("unchecked") @Override public EventTriggerDesc deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (!(json instanceof JsonObject)) { throw new JsonParseException("Trigger parser expected an JsonObject but found " + json + " instead"); } JsonObject jsonData = (JsonObject) json; String triggerClassName = GameEventTrigger.class.getPackage().getName() + "." + jsonData.get("class").getAsString(); Class<? extends GameEventTrigger> triggerClass; try { triggerClass = (Class<? extends GameEventTrigger>) Class.forName(triggerClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new JsonParseException("Trigger parser encountered an invalid class: " + triggerClassName); } Map<EventTriggerArg, Object> arguments = EventTriggerDesc.build(triggerClass); parseArgument(EventTriggerArg.ACTION_TYPE, jsonData, arguments, ParseValueType.ACTION_TYPE); parseArgument(EventTriggerArg.CARD_TYPE, jsonData, arguments, ParseValueType.CARD_TYPE); parseArgument(EventTriggerArg.FIRE_CONDITION, jsonData, arguments, ParseValueType.CONDITION); parseArgument(EventTriggerArg.HOST_TARGET_TYPE, jsonData, arguments, ParseValueType.TARGET_TYPE); parseArgument(EventTriggerArg.QUEUE_CONDITION, jsonData, arguments, ParseValueType.CONDITION); parseArgument(EventTriggerArg.RACE, jsonData, arguments, ParseValueType.RACE); parseArgument(EventTriggerArg.REQUIRED_ATTRIBUTE, jsonData, arguments, ParseValueType.ATTRIBUTE); parseArgument(EventTriggerArg.SOURCE_ENTITY_TYPE, jsonData, arguments, ParseValueType.ENTITY_TYPE); parseArgument(EventTriggerArg.SOURCE_PLAYER, jsonData, arguments, ParseValueType.TARGET_PLAYER); parseArgument(EventTriggerArg.SOURCE_TYPE, jsonData, arguments, ParseValueType.CARD_TYPE); parseArgument(EventTriggerArg.TARGET, jsonData, arguments, ParseValueType.TARGET_REFERENCE); parseArgument(EventTriggerArg.TARGET_ENTITY_TYPE, jsonData, arguments, ParseValueType.ENTITY_TYPE); parseArgument(EventTriggerArg.TARGET_PLAYER, jsonData, arguments, ParseValueType.TARGET_PLAYER); parseArgument(EventTriggerArg.VALUE, jsonData, arguments, ParseValueType.VALUE); return new EventTriggerDesc(arguments); } private void parseArgument(EventTriggerArg arg, JsonObject jsonData, Map<EventTriggerArg, Object> arguments, ParseValueType valueType) { String argName = ParseUtils.toCamelCase(arg.toString()); if (!jsonData.has(argName)) { return; } Object value = ParseUtils.parse(argName, jsonData, valueType); arguments.put(arg, value); } }