anchor.diff:      fMapsInfo: TKMCampaignMapDataArray;
   
       fMapsProgressData: TKMCampaignMapProgressDataArray; //Map data, saved in campaign progress
  +
  +    function GetDefaultMissionTitle(aIndex: Byte): UnicodeString;
  +
       procedure SetUnlockedMap(aValue: Byte);
       procedure SetMapCount(aValue: Byte);
   
  
positive.code:       //Otherwise just Append (by default MissionName is empty anyway)
        Result := Format(fTextLib[3], [aIndex+1]) + fMapsInfo[aIndex].MissionName;
    end
    //We have %d in custom mission name
    else if CountMatches(fMapsInfo[aIndex].MissionName, '%d') = 1 then       
      Result := Format(fMapsInfo[aIndex].MissionName, [aIndex+1])
    //We have custom mission name (without %d)
    else if fMapsInfo[aIndex].MissionName <> '' then
      Result := fMapsInfo[aIndex].MissionName
    else
      //Have nothing - use default mission name
      //Otherwise just Append (by default MissionName is empty anyway)
      Result := Format(gResTexts[TX_GAME_MISSION], [aIndex+1]) + fMapsInfo[aIndex].MissionName;
  end;
  
  
  
negative.code: end;
  
  
  function TKMCampaign.GetDefaultMissionTitle(aIndex: Byte): UnicodeString;
  begin
    if fMapsInfo[aIndex].MissionName <> '' then
      Result := fMapsInfo[aIndex].MissionName
    else
      //Have nothing - use default mission name
      //Otherwise just Append (by default MissionName is empty anyway)
      Result := Format(gResTexts[TX_GAME_MISSION], [aIndex+1]) + fMapsInfo[aIndex].MissionName;
  end;
  
  
  function TKMCampaign.GetCampaignMissionTitle(aIndex: Byte): UnicodeString;
  begin
    //We have template for mission name in 3:
  