anchor.diff:      for I := 0 to CampCount - 1 do
       begin
         M.Read(CampName);
  +      M.Read(Unlocked);
         C := CampaignByTitle(AnsiString(CampName));
         if C <> nil then
  -        C.LoadProgress(M);
  -        //todo: Handle `else`
  +        C.UnlockedMaps := Unlocked;
       end;
     finally
       M.Free;
  
positive.code: end;
  
  
  procedure TKMCampaign.LoadProgress(M: TKMemoryStream);
  begin
    M.Read(fUnlockedMaps);
  end;
  
  
  //Mission texts of original campaigns are available in all languages,
  //custom campaigns are unlikely to have more texts in more than 1-2 languages
  function TKMCampaign.MissionText(aIndex: byte): string;
  
negative.code:   C: TKMCampaign;
    I, CampCount: Integer;
    CampName: string;
    Unlocked: Byte;
  begin
    if not FileExists(FileName) then Exit;
  
  