Files

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;
}
}