package com.galvarez.ttw.model.data; import static java.util.stream.Collectors.toSet; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.Json.ReadOnlySerializer; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.ObjectFloatMap; import com.galvarez.ttw.model.Faction; import com.galvarez.ttw.model.map.Terrain; public final class Discovery { public final String name; public final Set<Terrain> terrains = EnumSet.noneOf(Terrain.class); public final Set<String> groups; public final Set<Set<String>> previous; public ObjectFloatMap<Faction> factions; /** * Indexed by effect name, contains the delta for the corresponding variable. * Positive numbers are positive modifiers for the discoverer. */ public final Map<String, Object> effects; private Discovery(String name, List<List<String>> previous, List<String> groups, List<Terrain> terrains, Map<String, Object> effects) { this.name = name; this.effects = effects != null ? effects : Collections.emptyMap(); this.previous = previous.stream().filter(l -> !l.isEmpty()).map(l -> set(l)).collect(toSet()); this.groups = set(groups); if (terrains != null) this.terrains.addAll(terrains); } @SuppressWarnings("unchecked") private static <T> Set<T> set(List<T> list) { if (list == null || list.isEmpty()) return Collections.emptySet(); if (list.size() == 1) return Collections.singleton(list.get(0)); else if (list instanceof Set) return (Set<T>) list; else return new HashSet<>(list); } public Discovery(String name) { this(name, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null); } public String getName() { return name; } @Override public String toString() { return name; } @Override public int hashCode() { return name.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) return true; else if (obj instanceof Discovery) return name.equals(((Discovery) obj).name); else return false; } public static final ReadOnlySerializer<Discovery> SER = new ReadOnlySerializer<Discovery>() { @SuppressWarnings("unchecked") @Override public Discovery read(Json json, JsonValue data, Class type) { return new Discovery(data.getString("name"), // json.readValue(ArrayList.class, ArrayList.class, data.get("previous")), // json.readValue(ArrayList.class, data.get("groups")), // json.readValue(ArrayList.class, Terrain.class, data.get("terrains")), // json.readValue(HashMap.class, data.get("effects"))); } }; }