docs: def generate_csv(data):
    """Generate a CSV of the abilities for easy commenting."""
    print(",".join([
        "ability_id",
        "link_name",
        "link_index",
        "button_name",
        "hotkey",
        "friendly_name",
        "remap_to",
        "mismatch",
    ]))
    for ability in sorted(six.itervalues(data.abilities),
                          key=lambda a: sort_key(data, a)):
      ab_id = ability.ability_id
      if ab_id in skip_abilities or (ab_id not in data.general_abilities and
                                     ab_id not in used_abilities):
        continue
  
      general = ""
      if ab_id in data.general_abilities:
        general = "general"
      elif ability.remaps_to_ability_id:
        general = ability.remaps_to_ability_id
  
      mismatch = ""
      if ability.remaps_to_ability_id:
        def check_mismatch(ability, parent, attr):
          if getattr(ability, attr) != getattr(parent, attr):
            return "%s: %s" % (attr, getattr(ability, attr))
  
        parent = data.abilities[ability.remaps_to_ability_id]
        mismatch = "; ".join(filter(None, [
            check_mismatch(ability, parent, "available"),
            check_mismatch(ability, parent, "target"),
            check_mismatch(ability, parent, "allow_minimap"),
            check_mismatch(ability, parent, "allow_autocast"),
            check_mismatch(ability, parent, "is_building"),
            check_mismatch(ability, parent, "footprint_radius"),
            check_mismatch(ability, parent, "is_instant_placement"),
            check_mismatch(ability, parent, "cast_range"),
        ]))
  
      print(",".join(str(s) for s in [
          ability.ability_id,
          ability.link_name,
          ability.link_index,
          ability.button_name,
          ability.hotkey,
          ability.friendly_name,
          general,
          mismatch,
      ]))