using System; using System.Collections.Generic; // Разделы рейтинга (как вкладки слева на панели) public enum RatingCategory { Players, Circles, Power, PvP, Development, Season } [Serializable] public class RatingEntry { public int place; public string id; // id игрока или Круга public string name; // имя игрока или название Круга public string circleName; // Круг игрока (для рейтинга Кругов -- имя главы) public long power; } // Рейтинг. Пока заглушка: 50 выдуманных игроков, числа -- как на референсе, для проверки вёрстки. // Когда появится сервер, он будет считать рейтинг и отдавать его постранично через GetPage. public class RatingService { private static RatingService instance; public static RatingService Instance => instance ??= new RatingService(); private readonly List players = new List(); private readonly List circles = new List(); static readonly string[] PlayerNames = { "Велес", "Север", "Тайрон", "DreadWolf", "Мороз", "Леший", "Князь", "Варяг", "Сокол", "Ратибор", "Светозар", "Добромир", "Велимир", "Ярополк", "Всеслав", "Мстислав", "Остромир", "Богдан", "Любомир", "Твердислав", "Радим", "Гостомысл", "Вышеслав", "Путята", "Ставр", "Чурила", "Микула", "Василиса", "Забава", "IronBear", "Ярослав", "Горазд", "Будимир", "Ждан", "Первуша", "Томир", "Вадим", "Олег", "Игорь", "Святослав", "Рогволд", "Судислав", "Любава", "Милава", "Велеслава", "Snowfox", "Berserk", "Кузьма", "Потап", "Никита" }; static readonly string[] CircleNames = { "Круг Перуна", "Стальные Волки", "Сыны Руси", "Богатыри", "Северный Страж", "Вольные", "Златые Земли", "Серые Горны", "Речные", "Перунов Круг" }; RatingService() { var rng = new Random(20260926); long power = 128_530_000; for (int i = 0; i < PlayerNames.Length; i++) { players.Add(new RatingEntry { place = i + 1, id = $"player_{i + 1}", name = PlayerNames[i], circleName = CircleNames[i % CircleNames.Length], power = power }); // Каждый следующий слабее на 5-15% power = power * rng.Next(85, 96) / 100; } BuildCircleRating(); } void BuildCircleRating() { var totals = new Dictionary(); var leaders = new Dictionary(); foreach (var p in players) { totals.TryGetValue(p.circleName, out long sum); totals[p.circleName] = sum + p.power; if (!leaders.ContainsKey(p.circleName)) leaders[p.circleName] = p.name; // игроки уже по убыванию мощи } foreach (var name in CircleNames) { circles.Add(new RatingEntry { id = name, name = name, circleName = leaders[name], power = totals[name] }); } circles.Sort((a, b) => b.power.CompareTo(a.power)); for (int i = 0; i < circles.Count; i++) circles[i].place = i + 1; } List GetList(RatingCategory category) { switch (category) { case RatingCategory.Players: case RatingCategory.Power: // пока мощь = рейтинг игроков return players; case RatingCategory.Circles: return circles; default: return null; } } public bool IsAvailable(RatingCategory category) { return GetList(category) != null; } public int GetTotalCount(RatingCategory category) { return GetList(category)?.Count ?? 0; } public List GetPage(RatingCategory category, int pageIndex, int pageSize) { var result = new List(); List list = GetList(category); if (list == null) return result; int start = pageIndex * pageSize; for (int i = start; i < start + pageSize && i < list.Count; i++) result.Add(list[i]); return result; } }