Files

88 lines
4.8 KiB
C#
Raw Permalink Normal View History

using UnityEngine;
using TMPro;
// БОЙ: кампания из этапов. Сила армии против силы врага -> шанс победы.
// Победа: ресурсы, опыт, следующий этап, небольшие потери. Поражение: большие потери войск.
public class BattlePanel : BasePanel
{
protected override void Build(RectTransform root)
{
var d = GP.Data;
int stage = d.battleStage;
int enemy = GameData.StageEnemyPower(stage);
int mine = GP.ArmyPower;
float chance = GameProgress.WinChance(mine, enemy);
var list = ScrollList(root);
// --- Моя армия ---
var army = UIKit.Card(list, UIKit.Theme.CardDark);
var ar = UIKit.Row(army, 60, 10);
var at = UIKit.Text(ar, "Ваша армия: " + mine.ToString("N0"), 32, UIKit.Theme.Text);
at.fontStyle = FontStyles.Bold;
UIKit.Size(at, -1, -1, 1);
UIKit.Size(UIKit.Button(ar, "Войска", UIKit.Theme.Gray, () => OpenPanel("Troops"), 160, 60, 24), 160, 60);
UIKit.Text(army, "Воинов: " + GP.TotalTroops.ToString("N0") + " • Герой " + d.heroLevel + " ур. (+" +
Mathf.RoundToInt(GP.ArmyBonus * 100) + "%)", 24, UIKit.Theme.TextDim);
// --- Глобальная карта ---
var world = UIKit.Card(list, new Color(0.16f, 0.27f, 0.17f));
UIKit.Text(world, "Карта мира: отправляйте армию грабить поселения и приносите добычу домой.", 24, UIKit.Theme.Text);
UIKit.Button(world, "ОТКРЫТЬ КАРТУ МИРА", UIKit.Theme.Green, () => OpenPanel("World"), -1, 90, 30);
// --- Текущий этап ---
var card = UIKit.Card(list, new Color(0.3f, 0.14f, 0.13f), 24, 12);
UIKit.Text(card, "ЭТАП " + stage, 28, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
UIKit.Text(card, GameData.StageName(stage), 42, UIKit.Theme.Gold, TextAlignmentOptions.Center).fontStyle = FontStyles.Bold;
UIKit.Text(card, "Сила врага: " + enemy.ToString("N0"), 32, UIKit.Theme.Text, TextAlignmentOptions.Center);
Color cc = chance >= 0.7f ? UIKit.Theme.Green : (chance >= 0.4f ? UIKit.Theme.Gold : UIKit.Theme.Red);
UIKit.Bar(card, chance, cc, 40, "Шанс победы: " + Mathf.RoundToInt(chance * 100) + "%");
string rewards = GameData.RewardsText(GameData.StageRewards(stage)) + ", " + GameData.StageXp(stage) + " опыта";
if (GameData.StageGems(stage) > 0) rewards += ", " + GameData.StageGems(stage) + " кристаллов";
UIKit.Text(card, "Награда: " + rewards, 26, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
if (GP.TotalTroops == 0)
{
UIKit.Text(card, "У вас нет войск! Сначала обучите их.", 28, UIKit.Theme.Red, TextAlignmentOptions.Center);
UIKit.Button(card, "Перейти к войскам", UIKit.Theme.Blue, () => OpenPanel("Troops"), -1, 100, 32);
}
else
{
UIKit.Button(card, "В БОЙ!", UIKit.Theme.Red, Fight, -1, 120, 44);
if (chance < 0.4f)
UIKit.Text(card, "Совет: обучите больше войск или улучшите героя.", 24, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
}
// --- Следующие этапы ---
var next = UIKit.Card(list);
ProfilePanel.Header(next, "Впереди");
for (int s = stage + 1; s <= stage + 4; s++)
{
string extra = GameData.StageGems(s) > 0 ? " • кристаллы" : "";
ProfilePanel.KV(next, s + ". " + GameData.StageName(s), "сила " + GameData.StageEnemyPower(s).ToString("N0") + extra);
}
UIKit.Text(next, "Пройдено этапов: " + (stage - 1) + " • Побед: " + d.battlesWon + " • Поражений: " + d.battlesLost,
24, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
}
void Fight()
{
var r = GP.FightStage();
if (r == null) return;
if (r.win)
{
UIKit.Message("ПОБЕДА!",
r.enemy + " повержен!\n\nНаграда: " + GameData.RewardsText(r.rewards) + ", " + r.xp + " опыта\n" +
"Потери: " + r.lost + " воинов", "Отлично");
GP.Vibrate();
}
else
{
UIKit.Message("Поражение",
"Армия отступила от «" + r.enemy + "».\n\nПотери: " + r.lost + " воинов\n\n" +
"Обучите больше войск или улучшите героя и попробуйте снова.", "Понятно");
}
}
}