anchor.diff:    Result := IfThen(Value > 0, IntToStr(Value), '');
   end;
   
  +
  +{ TKMGUIGameSpectatorItemLineWareFare }
  +constructor TKMGUIGameSpectatorItemLineWareFare.Create(aParent: TKMPanel; AHandIndex: Integer; aOnJumpToPlayer: TIntegerEvent);
  +begin
  +  inherited Create(aParent, AHandIndex, aOnJumpToPlayer);
  +  FShowEmptyItems := True;
  +end;
  +
  +function TKMGUIGameSpectatorItemLineWareFare.CreateItem(AHandIndex: Integer; ATag: Integer): TKMGUIGameSpectatorItem;
  +begin
  +  Result := TKMGUIGameSpectatorItem.Create(Self, ATag,
  +                                           TKMGUIGameSpectatorItemLineWareFare.GetIcon(ATag),
  +                                           TKMGUIGameSpectatorItemLineWareFare.GetTitle(ATag), FHandIndex);
  +  Result.Visible := False;
  +end;
  +
  +class function TKMGUIGameSpectatorItemLineWareFare.GetIcon(aTag: Integer): Word;
  +begin
  +  if aTag = -1 then
  +    Result := gRes.Units[ut_Recruit].GUIIcon
  +  else
  +    Result := gRes.Wares[TKMWareType(ATag)].GUIIcon;
  +end;
  +
  +class function TKMGUIGameSpectatorItemLineWareFare.GetTitle(aTag: Integer): UnicodeString;
  +begin
  +  if aTag = -1 then
  +    Result := gRes.Units[ut_Recruit].GUIName
  +  else
  +    Result := gRes.Wares[TKMWareType(ATag)].Title;
  +end;
  +
  +function TKMGUIGameSpectatorItemLineWareFare.GetTagCount: Integer;
  +begin
  +  Result := Integer(WARFARE_MAX) - Integer(WARFARE_MIN) + 1 + 1; //+1 for recruit
  +end;
  +
  +function TKMGUIGameSpectatorItemLineWareFare.GetTag(AIndex: Integer): Integer;
  +begin
  +  Result := IfThen(AIndex = 0, -1, Integer(WARFARE_MAX) - AIndex + 1); //Recruit is the last
  +end;
  +
  +function TKMGUIGameSpectatorItemLineWareFare.GetValue(AHandIndex: Integer; ATag: Integer): String;
  +var
  +  Value: Integer;
  +begin
  +  if aTag = -1 then
  +    Value := gHands[AHandIndex].Stats.GetUnitQty(ut_Recruit)
  +  else
  +    Value := gHands[AHandIndex].Stats.GetWareBalance(TKMWareType(ATag));
  +
  +  Result := IfThen(Value > 0, IntToStr(Value), '');
  +end;
  +
   { TKMGUIGameSpectatorItemLineCustomBuildings }
   function TKMGUIGameSpectatorItemLineCustomBuildings.CreateItem(AHandIndex: Integer; ATag: Integer): TKMGUIGameSpectatorItem;
   begin
  
positive.code:     fItems[i].Value := GetValue(FHandIndex, GetTag(i));
      fItems[i].AdditionalValue := GetAdditionalValue(FHandIndex, GetTag(i));
      fItems[i].Progress := GetProgress(FHandIndex, GetTag(i));
      fItems[i].Visible := (fItems[i].Value <> '') or (fItems[i].AdditionalValue <> '') or (fItems[i].Progress >= 0);
      if fItems[i].Visible then
        Inc(Count);
    end;
  
negative.code: 
    FLastIndex := 0;
  
    SetLength(FLines, 10);
  
    AddLineType(0, nil);
    AddLineType(1, TKMGUIGameSpectatorItemLineResources);
    AddLineType(2, TKMGUIGameSpectatorItemLineWareFare);
    AddLineType(3, TKMGUIGameSpectatorItemLineBuildings);
    AddLineType(4, TKMGUIGameSpectatorItemLineBuild);
    AddLineType(5, TKMGUIGameSpectatorItemLinePopulation);
    AddLineType(6, TKMGUIGameSpectatorItemLineArmy);
    AddLineType(7, TKMGUIGameSpectatorItemLineArmyTotal);
    AddLineType(8, TKMGUIGameSpectatorItemLineArmyKilling);
    AddLineType(9, TKMGUIGameSpectatorItemLineArmyLost);
  
    FDropBox := TKMDropList.Create(FDropBoxPanel, 5, 5, DROPBOX_W, 20, fnt_Metal, '', bsGame);
    FDropBox.OnChange := ChangePage;
  
    FDropBox.Add(gResTexts[TX_WORD_NONE]);
    FDropBox.Add(gResTexts[TX_WORD_RESOURCES]);
    FDropBox.Add(gResTexts[TX_RESOURCES_WARFARE]);
    FDropBox.Add(gResTexts[TX_WORD_HOUSES]);
    FDropBox.Add(gResTexts[TX_WORD_CONSTRUCTING]);
    FDropBox.Add(gResTexts[TX_WORD_CITIZENS]);
  