110 lines
5.8 KiB
C#
110 lines
5.8 KiB
C#
using UnityEngine;
|
|
using TMPro;
|
|
|
|
// АРЕНА: бои с другими "игроками" (пока боты) за рейтинг. Билеты: 5 штук, 1 восстанавливается за 20 минут.
|
|
// Вкладка "Рейтинг" -- таблица лидеров и ваше место. Лиги: Бронза -> Серебро -> Золото -> Платина -> Алмаз.
|
|
public class ArenaPanel : BasePanel
|
|
{
|
|
int tab;
|
|
TextMeshProUGUI ticketsText;
|
|
|
|
protected override void Build(RectTransform root)
|
|
{
|
|
var col = UIKit.Card(root, new Color(0, 0, 0, 0), 0, 12);
|
|
UIKit.Stretch(col);
|
|
UIKit.Tabs(col, new[] { "Бой", "Рейтинг" }, tab, i => { tab = i; RequestRebuild(); });
|
|
var holder = UIKit.Make("ListHolder", col);
|
|
UIKit.Size(holder, -1, -1).flexibleHeight = 1;
|
|
var list = ScrollList(holder);
|
|
ticketsText = null;
|
|
|
|
if (tab == 0) BuildFights(list); else BuildRating(list);
|
|
}
|
|
|
|
void BuildFights(RectTransform list)
|
|
{
|
|
var d = GP.Data;
|
|
int mine = GP.ArmyPower;
|
|
|
|
var head = UIKit.Card(list, new Color(0.15f, 0.2f, 0.35f));
|
|
UIKit.Text(head, "Рейтинг: " + d.arenaRating + " • Лига: " + GameData.ArenaLeague(d.arenaRating),
|
|
32, UIKit.Theme.Gold, TextAlignmentOptions.Center).fontStyle = FontStyles.Bold;
|
|
UIKit.Text(head, "Ваша сила: " + mine.ToString("N0") + " • Побед: " + d.arenaWins + " из " + d.arenaFights,
|
|
24, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
|
|
ticketsText = UIKit.Text(head, "", 28, UIKit.Theme.Text, TextAlignmentOptions.Center);
|
|
Tick();
|
|
|
|
if (GP.TotalTroops == 0)
|
|
{
|
|
UIKit.Text(list, "Для боёв на арене нужны войска.", 28, UIKit.Theme.Red, TextAlignmentOptions.Center, 60);
|
|
UIKit.Button(list, "Перейти к войскам", UIKit.Theme.Blue, () => OpenPanel("Troops"), -1, 90);
|
|
}
|
|
|
|
var opps = GP.ArenaOpponents;
|
|
string[] tags = { "Лёгкий", "Равный", "Сильный" };
|
|
for (int i = 0; i < opps.Count; i++)
|
|
{
|
|
int idx = i;
|
|
var o = opps[i];
|
|
float chance = GameProgress.WinChance(mine, o.power);
|
|
var card = UIKit.Card(list);
|
|
var row = UIKit.Row(card, 120, 16);
|
|
UIKit.Icon(row, ProfilePanel.AvatarColors[(o.name.Length + i) % ProfilePanel.AvatarColors.Length], o.name.Substring(0, 1), 110);
|
|
var info = UIKit.Card(row, new Color(0, 0, 0, 0), 0, 2);
|
|
UIKit.Size(info, -1, -1, 1);
|
|
UIKit.Text(info, o.name + " <size=22><color=#c8c8c8>" + (i < tags.Length ? tags[i] : "") + "</color></size>", 30).fontStyle = FontStyles.Bold;
|
|
UIKit.Text(info, "Сила " + o.power.ToString("N0") + " • рейтинг " + o.rating, 24, UIKit.Theme.TextDim);
|
|
Color cc = chance >= 0.7f ? UIKit.Theme.Green : (chance >= 0.4f ? UIKit.Theme.Gold : UIKit.Theme.Red);
|
|
UIKit.Text(info, "Шанс победы " + Mathf.RoundToInt(chance * 100) + "%", 24, cc);
|
|
|
|
bool can = GP.TotalTroops > 0 && GP.ArenaTickets > 0;
|
|
var b = UIKit.Button(row, "Атаковать", can ? UIKit.Theme.Red : UIKit.Theme.Gray, () => Fight(idx), 200, 90);
|
|
b.interactable = can;
|
|
}
|
|
|
|
UIKit.Button(list, "Обновить соперников", UIKit.Theme.Gray, () => GP.GenerateOpponents(), -1, 80);
|
|
UIKit.Text(list, "Победа: +15..35 рейтинга, 150 золота, 5 кристаллов. Поражение: -8..14 рейтинга.",
|
|
22, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
|
|
}
|
|
|
|
void BuildRating(RectTransform list)
|
|
{
|
|
var board = GP.Leaderboard();
|
|
int myRank = board.FindIndex(e => e.power == -1) + 1;
|
|
UIKit.Text(list, "Ваше место: " + myRank + " из " + board.Count, 32, UIKit.Theme.Gold, TextAlignmentOptions.Center, 60)
|
|
.fontStyle = FontStyles.Bold;
|
|
|
|
for (int i = 0; i < board.Count; i++)
|
|
{
|
|
var e = board[i];
|
|
bool me = e.power == -1;
|
|
var row = UIKit.Row(list, 70, 14, me ? new Color(0.45f, 0.36f, 0.12f) : (i % 2 == 0 ? UIKit.Theme.Card : UIKit.Theme.CardDark), 10);
|
|
Color place = i == 0 ? UIKit.Theme.Gold : (i == 1 ? new Color(0.8f, 0.8f, 0.85f) : (i == 2 ? new Color(0.8f, 0.5f, 0.3f) : UIKit.Theme.TextDim));
|
|
UIKit.Size(UIKit.Text(row, (i + 1).ToString(), 30, place, TextAlignmentOptions.Center), 70);
|
|
var n = UIKit.Text(row, e.name, 28, me ? UIKit.Theme.Gold : UIKit.Theme.Text);
|
|
UIKit.Size(n, -1, -1, 1);
|
|
UIKit.Size(UIKit.Text(row, GameData.ArenaLeague(e.rating), 24, UIKit.Theme.TextDim, TextAlignmentOptions.Right), 140);
|
|
UIKit.Size(UIKit.Text(row, e.rating.ToString(), 28, UIKit.Theme.Text, TextAlignmentOptions.Right), 100);
|
|
}
|
|
}
|
|
|
|
void Fight(int index)
|
|
{
|
|
var r = GP.FightArena(index);
|
|
if (r == null) return;
|
|
if (r.win)
|
|
UIKit.Message("ПОБЕДА!", "Вы победили игрока " + r.opponent + "!\n\nРейтинг: +" + r.ratingChange +
|
|
"\nНаграда: " + GameData.RewardsText(r.rewards) + ", 15 опыта", "Отлично");
|
|
else
|
|
UIKit.Message("Поражение", r.opponent + " оказался сильнее.\n\nРейтинг: " + r.ratingChange, "Понятно");
|
|
}
|
|
|
|
protected override void Tick()
|
|
{
|
|
if (ticketsText == null) return;
|
|
int t = GP.ArenaTickets;
|
|
string next = t < GameData.ArenaMaxTickets ? " • +1 через " + GameData.FormatTime(GP.SecondsToNextTicket) : "";
|
|
ticketsText.text = "Билеты: " + t + " / " + GameData.ArenaMaxTickets + next;
|
|
}
|
|
}
|