anchor.diff:  Iterable<DamageEffect> parseEffects(Map data) sync* {
     String tooltip = data['tooltip'];
     for (TooltipMatch match in parseTooltip(tooltip, data['name'])) {
  -    List<double> baseByRank;
  +    List<int> baseByRank;
       if (match.baseVar.startsWith('e')) {
         baseByRank = lookupEffectArray(data, match.baseVar);
       } else {
         // Treat baseVar as a scaleVar instead:
         if (match.secondScaleVar != null)
  -        throw new ArgumentError('Matched too many variables.');
  +        throw new ArgumentError(
  +            'MATCHED too many variables in ${data["name"]}');
         match.secondScaleVar = match.firstScaleVar;
         match.firstScaleVar = match.baseVar;
         match.baseVar = null;
  -      baseByRank = new List.filled(data['maxrank'], 0.0);
  +      baseByRank = new List.filled(data['maxrank'], 0);
       }
       var effect = new DamageEffect(
         damageType: damageTypeFromString(match.damageType),
  
positive.code:         r = spell;
          break;
        default:
          throw new ArgumentError("$i is not in the range 0-3");
      }
    }
  }
  
negative.code:   }
  }
  
  List<int> lookupEffectArray(Map data, String effectName) {
    if (!effectName.startsWith('e')) {
      throw new ArgumentError(
          'NAME $effectName is not an effect in ${data["name"]}');
    }
  
    List<List<int>> effects = data['effect'];
    int effectIndex = int.parse(effectName.substring(1));
    List<int> effectArray = effects[effectIndex];
    if (effectArray == null) {
      throw new ArgumentError('LOOKUP failed for $effectName in ${data["name"]}');
    }
    return effectArray;
  }
  