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