Files

88 lines
4.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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" +
"Обучите больше войск или улучшите героя и попробуйте снова.", "Понятно");
}
}
}