package com.github.dtschust.zork.parser.strategies; import com.github.dtschust.zork.ZorkCondition; import com.github.dtschust.zork.ZorkTrigger; import com.github.dtschust.zork.objects.ZorkCreature; import com.github.dtschust.zork.parser.Property; import com.github.dtschust.zork.parser.PropertyParseStrategy; import com.github.dtschust.zork.parser.TriggerPropertyParseStrategy; import java.util.List; import java.util.stream.Collectors; public class ZorkCreatureParseStrategy implements PropertyParseStrategy { private final PropertyParseStrategy conditionStrategy; private final TriggerPropertyParseStrategy triggerStrategy; public ZorkCreatureParseStrategy(final PropertyParseStrategy conditionStrategy, final TriggerPropertyParseStrategy triggerStrategy) { this.conditionStrategy = conditionStrategy; this.triggerStrategy = triggerStrategy; } @Override public ZorkCreature parse(final Property source) { final List attacks = source.subPropertiesByName("attack"); // Get all possible creature attributes final List conditions = attacks.stream() .flatMap(e -> e.subPropertiesByName("condition").stream()) .map(conditionStrategy::parse) .collect(Collectors.toList()); final List prints = attacks.stream() .flatMap(e -> e.subPropertyValues("print").stream()) .collect(Collectors.toList()); final List actions = attacks.stream() .flatMap(e -> e.subPropertyValues("action").stream()) .collect(Collectors.toList()); final List vulnerabilities = source.subPropertyValues("vulnerability"); final List triggers = source.subPropertiesByName("trigger").stream() .map(triggerStrategy.parse(source)) .collect(Collectors.toList()); final String name = source.subPropertyValue("name", ""); final String description = source.subPropertyValue("description", ""); final String status = source.subPropertyValue("status", ""); return new ZorkCreature(name, description, status, triggers, vulnerabilities, conditions, prints, actions); } }