anchor.diff:        //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;
  +    Result := GetDefaultMissionTitle(aIndex);
   end;
   
   
  
positive.code:     fMapsInfo: TKMCampaignMapDataArray;
  
      fMapsProgressData: TKMCampaignMapProgressDataArray; //Map data, saved in campaign progress
      procedure SetUnlockedMap(aValue: Byte);
      procedure SetMapCount(aValue: Byte);
  
  
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:
  