package org.mafagafogigante.dungeon.entity.items; import org.mafagafogigante.dungeon.date.DungeonTimeParser; import org.mafagafogigante.dungeon.entity.Integrity; import org.mafagafogigante.dungeon.entity.Luminosity; import org.mafagafogigante.dungeon.entity.TagSet.InvalidTagException; import org.mafagafogigante.dungeon.entity.Weight; import org.mafagafogigante.dungeon.game.Id; import org.mafagafogigante.dungeon.game.NameFactory; import org.mafagafogigante.dungeon.io.JsonObjectFactory; import org.mafagafogigante.dungeon.logging.DungeonLogger; import org.mafagafogigante.dungeon.util.Percentage; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.Set; /** * An ItemPresetFactory based on JSON files. */ public class JsonItemPresetFactory implements ItemPresetFactory { private final String filename; public JsonItemPresetFactory(String filename) { this.filename = filename; } /** * Creates a Set of tags from an array of Strings. * * @param enumClass the Class of the enum * @param array a JSON array of strings * @param <E> an Enum type * @return a Set of Item.Tag */ private static <E extends Enum<E>> Set<E> tagSetFromArray(Class<E> enumClass, JsonArray array) { Set<E> set = EnumSet.noneOf(enumClass); for (JsonValue value : array) { String tag = value.asString(); try { set.add(Enum.valueOf(enumClass, tag)); } catch (IllegalArgumentException fatal) { // Guarantee that bugged resource files are not going to make it to a release. String message = "invalid tag '" + tag + "' found."; throw new InvalidTagException(message, fatal); } } return set; } @Override public Collection<ItemPreset> getItemPresets() { JsonObject objects = JsonObjectFactory.makeJsonObject(filename); Collection<ItemPreset> itemPresets = new ArrayList<>(); for (JsonValue value : objects.get("items").asArray()) { JsonObject itemObject = value.asObject(); ItemPreset preset = new ItemPreset(); Id id = new Id(itemObject.get("id").asString()); preset.setId(id); preset.setType(itemObject.get("type").asString()); preset.setName(NameFactory.fromJsonObject(itemObject.get("name").asObject())); for (Item.Tag tag : tagSetFromArray(Item.Tag.class, itemObject.get("tags").asArray())) { preset.addTag(tag); } preset.setUnique(itemObject.getBoolean("unique", false)); if (itemObject.get("decompositionPeriod") != null) { long seconds = DungeonTimeParser.parsePeriod(itemObject.get("decompositionPeriod").asString()).getSeconds(); preset.setPutrefactionPeriod(seconds); } JsonObject integrity = itemObject.get("integrity").asObject(); preset.setIntegrity(new Integrity(integrity.get("current").asInt(), integrity.get("maximum").asInt())); preset.setVisibility(Percentage.fromString(itemObject.get("visibility").asString())); if (itemObject.get("luminosity") != null) { preset.setLuminosity(new Luminosity(Percentage.fromString(itemObject.get("luminosity").asString()))); } preset.setWeight(Weight.newInstance(itemObject.get("weight").asDouble())); preset.setDamage(itemObject.get("damage").asInt()); preset.setHitRate(Percentage.fromString(itemObject.get("hitRate").asString())); preset.setIntegrityDecrementOnHit(itemObject.get("integrityDecrementOnHit").asInt()); if (itemObject.get("nutrition") != null) { preset.setNutrition(itemObject.get("nutrition").asInt()); } if (itemObject.get("integrityDecrementOnEat") != null) { preset.setIntegrityDecrementOnEat(itemObject.get("integrityDecrementOnEat").asInt()); } if (preset.hasTag(Item.Tag.BOOK)) { preset.setText(itemObject.get("text").asString()); } if (preset.hasTag(Item.Tag.DRINKABLE)) { preset.setDrinkableDoses(itemObject.get("drinkableDoses").asInt()); preset.setDrinkableHealing(itemObject.get("drinkableHealing").asInt()); preset.setIntegrityDecrementPerDose(itemObject.get("integrityDecrementPerDose").asInt()); } if (itemObject.get("spell") != null) { preset.setSpellId(itemObject.get("spell").asString()); } itemPresets.add(preset); } DungeonLogger.info("Loaded " + itemPresets.size() + " item presets."); return itemPresets; } }