126 lines
4.8 KiB
C#
126 lines
4.8 KiB
C#
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<RatingEntry> players = new List<RatingEntry>();
|
|
private readonly List<RatingEntry> circles = new List<RatingEntry>();
|
|
|
|
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<string, long>();
|
|
var leaders = new Dictionary<string, string>();
|
|
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<RatingEntry> 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<RatingEntry> GetPage(RatingCategory category, int pageIndex, int pageSize)
|
|
{
|
|
var result = new List<RatingEntry>();
|
|
List<RatingEntry> 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;
|
|
}
|
|
}
|