@Override
    protected void readChild(XMLStreamReader in) throws XMLStreamException {
        String childName = in.getLocalName();
        if ("gen".equals(childName)) {
            humidity[0] = getAttribute(in, "humidityMin", 0);
            humidity[1] = getAttribute(in, "humidityMax", 100);
            temperature[0] = getAttribute(in, "temperatureMin", -20);
            temperature[1] = getAttribute(in, "temperatureMax", 40);
            altitude[0] = getAttribute(in, "altitudeMin", 0);
            altitude[1] = getAttribute(in, "altitudeMax", 0);
            in.nextTag(); // close this element
        } else if ("production".equals(childName)
                   || "primary-production".equals(childName)
                   || "secondary-production".equals(childName)) {
            GoodsType type = getSpecification().getGoodsType(in.getAttributeValue(null, "goods-type"));
            int amount = Integer.parseInt(in.getAttributeValue(null, VALUE_TAG));
            AbstractGoods goods = new AbstractGoods(type, amount);
            String tileProduction = in.getAttributeValue(null, "tile-production");
            if ("primary-production".equals(childName)) {
                primaryGoodsMap.put(tileProduction, goods);
            } else if ("secondary-production".equals(childName)) {
                secondaryGoodsMap.put(tileProduction, goods);
            } else {
                Map<GoodsType, AbstractGoods> oldValue = productionMap.get(tileProduction);
                if (oldValue == null) {
                    oldValue = new HashMap<GoodsType, AbstractGoods>();
                    productionMap.put(tileProduction, oldValue);
                }
                oldValue.put(type, goods);
            }
            in.nextTag(); // close this element
        } else if ("resource".equals(childName)) {
            ResourceType type = getSpecification().getResourceType(in.getAttributeValue(null, "type"));
            int probability = getAttribute(in, "probability", 100);
            resourceType.add(new RandomChoice<ResourceType>(type, probability));
            in.nextTag(); // close this element
        } else if ("disaster".equals(childName)) {
            Disaster disaster = getSpecification().getDisaster(in.getAttributeValue(null, "id"));
            int probability = getAttribute(in, "probability", 100);
            disasters.add(new RandomChoice<Disaster>(disaster, probability));
            in.nextTag(); // close this element
        } else {
            super.readChild(in);
        }
    }