package tc.oc.pgm.stamina; import java.util.logging.Logger; import org.jdom2.Document; import org.jdom2.Element; import tc.oc.pgm.map.MapModule; import tc.oc.pgm.map.MapModuleContext; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchModuleFactory; import tc.oc.pgm.module.ModuleDescription; import tc.oc.pgm.stamina.mutators.SimpleMutator; import tc.oc.pgm.stamina.mutators.StaminaMutator; import tc.oc.pgm.stamina.symptoms.ArcherySymptom; import tc.oc.pgm.stamina.symptoms.MeleeSymptom; import tc.oc.pgm.stamina.symptoms.PotionSymptom; import tc.oc.pgm.utils.NumericModifier; import tc.oc.pgm.utils.XMLUtils; import tc.oc.pgm.xml.InvalidXMLException; import tc.oc.pgm.xml.Node; @ModuleDescription(name = "Stamina") public class StaminaModule implements MapModule, MatchModuleFactory<StaminaMatchModule> { private final StaminaOptions options; public StaminaModule(StaminaOptions options) { this.options = options; } @Override public StaminaMatchModule createMatchModule(Match match) { return new StaminaMatchModule(match, options); } public static StaminaModule parse(MapModuleContext context, Logger logger, Document doc) throws InvalidXMLException { StaminaOptions options = new StaminaOptions(); boolean configured = false; for(Element elStamina : doc.getRootElement().getChildren("stamina")) { configured = true; parseOptions(context, elStamina, options); } return configured ? new StaminaModule(options) : null; } private static void parseOptions(MapModuleContext context, Element el, StaminaOptions options) throws InvalidXMLException { options.mutators.sneak = parseMutator(el, "sneak"); options.mutators.stand = parseMutator(el, "stand"); options.mutators.walk = parseMutator(el, "walk"); options.mutators.run = parseMutator(el, "run"); options.mutators.jump = parseMutator(el, "jump"); options.mutators.runJump = parseMutator(el, "run-jump"); options.mutators.injury = parseMutator(el, "injury"); options.mutators.meleeMiss = parseMutator(el, "melee-miss"); options.mutators.meleeHit = parseMutator(el, "melee-hit"); options.mutators.archery = parseMutator(el, "archery"); for(Element elSymptoms : XMLUtils.flattenElements(el, "symptoms")) { switch(elSymptoms.getName()) { case "potion": options.symptoms.add(parsePotionSymptom(elSymptoms)); break; case "melee": options.symptoms.add(parseMeleeSymptom(elSymptoms)); break; case "archery": options.symptoms.add(parseArcherySymptom(elSymptoms)); break; default: throw new InvalidXMLException("Invalid symptom type", elSymptoms); } } } private static StaminaMutator parseMutator(Element el, String name) throws InvalidXMLException { NumericModifier modifier = null; Element elMutators = el.getChild("mutators"); if(elMutators != null) { modifier = XMLUtils.parseNumericModifier(elMutators.getChild(name), null); } return new SimpleMutator(name, modifier != null ? modifier : NumericModifier.ZERO, "stamina.mutator." + name); } private static PotionSymptom parsePotionSymptom(Element el) throws InvalidXMLException { return new PotionSymptom(XMLUtils.parseNumericRange(el, Double.class), XMLUtils.parsePotionEffectType(Node.fromRequiredAttr(el, "effect")), XMLUtils.parseNumber(Node.fromAttr(el, "amplifier"), Integer.class, 1) - 1); } private static MeleeSymptom parseMeleeSymptom(Element el) throws InvalidXMLException { return new MeleeSymptom(XMLUtils.parseNumericRange(el, Double.class), XMLUtils.parseNumericModifier(el)); } private static ArcherySymptom parseArcherySymptom(Element el) throws InvalidXMLException { return new ArcherySymptom(XMLUtils.parseNumericRange(el, Double.class), XMLUtils.parseNumericModifier(el)); } }