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" + "Обучите больше войск или улучшите героя и попробуйте снова.", "Понятно"); } } }