anchor.diff:    }
   
     void lifestealFrom(double damage) {
  -    healFor(damage * stats.lifesteal);
  -  }
  -
  -  void healFor(double healing) {
  +    healFor(damage * stats.lifesteal, 'lifesteal');
  +  }
  +
  +  void healFor(double healing, String source) {
  +    if (healing == 0.0) return;
  +    assert(healing > 0.0);
  +    _log.fine(
  +        "$this healed ${healing.toStringAsFixed(1)} from $source $hpStatusString remains");
       // FIXME: Missing healing modifiers.
       hpLost -= min(hpLost, healing);
     }
  
positive.code: 
    bool call(Mob attacker) {
      if (attacker.stats.critChance == 0.0) return false;
      return randomForChamp[attacker.id].nextDouble() < attacker.stats.critChance;
    }
  }
  
  
negative.code:     return null;
    }
  
    Mob.fromJSON(Map<String, dynamic> json, this.type)
        : baseStats = new BaseStats.fromJSON(json['stats']) {
      id = json['id'];
      name = json['name'];
      title = json['title'];
      ChampionEffectsConstructor effectsConstructor =
          championEffectsConstructors[id];
      if (effectsConstructor != null) effects = effectsConstructor(this);
  