public float SelectRandomItemAndGenerateNewDisplay()
        {
            Item query = SelectRandomItem();

#if VERBOSE
            Console.WriteLine("Layer {0}, selected {1}, drop probability: {2}",
                              LayerDepth, query.LayerLocalId, DropProbability(query.Id));
#endif
            float searchedItemDistance = Item.GetDistanceSQR(query.Descriptor, SearchedItem.Descriptor);
            Logs.AddLast(new BrowsingLog(Logs.Count, Display.ToArray(), query, DropProbability(query.Id), searchedItemDistance, LayerDepth, BrowsingDepth));

            // zoom vs pan
            if ((LayerDepth < Mles.Layers.Length - 1) && (CurrentZoomingStep++) % ZoomingStep == 0)
            {
                // zoom
                LayerDepth++;
                GenerateNewDisplayZoom(query, LayerDepth, DisplaySize);
            }
            else
            {
                // pan
                GenerateNewDisplayPan(query, LayerDepth, DisplaySize);
            }

            BrowsingDepth++;

            if (DisplayContainsSearchedItem())
            {
                ItemFound = true;
            }

            return(Item.GetDistanceSQR(query.Descriptor, SearchedItem.Descriptor));
        }
            static void SaveLog(Log log)
            {
                Logs.AddLast(log);
                switch (log)
                {
                case Chat chat:
                    if (OptionsManager.IgnoreOwnMessages && chat.Name == OptionsManager.OwnUsername)
                    {
                        return;
                    }

                    Chats.Insert(0, chat);

                    if (chat.Translation.Message == chat.Message || chat.Translation.Message == "---")
                    {
                        return;
                    }

                    /* Send translation in chat over telnet if options allow it. */
                    switch (OptionsManager.SendTranslationsFrom)
                    {
                    case TelnetGrant.AllChat:
                        if (chat.ChatType == ChatType.Team)
                        {
                            return;
                        }
                        break;

                    case TelnetGrant.TeamChat:
                        if (chat.ChatType == ChatType.All)
                        {
                            return;
                        }
                        break;
                    }

                    TelnetHelper.SendChatTranslation(OptionsManager.SendTranslationsTo, chat);

                    break;

                case Command command:

                    /* Check options is command is allowed */
                    switch (OptionsManager.AllowCommandsFrom)
                    {
                    case TelnetGrant.Self:
                        if (command.Name != OptionsManager.OwnUsername)
                        {
                            return;
                        }
                        break;

                    case TelnetGrant.TeamChat:
                        if (command.ChatType == ChatType.All)
                        {
                            return;
                        }
                        break;

                    default:
                        return;
                    }

                    Commands.Insert(0, command);
                    break;
                }
            }