Загрузка данных


using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace SlsWpfNoBinding
{
    public partial class MainWindow : Window
    {
        // Логическая структура карты
        public class Card
        {
            public string Name { get; set; }
            public string Description { get; set; }
            public int Cost { get; set; }
            public Action Effect { get; set; }
        }

        // Состояние Игрока
        private int _playerHp = 80;
        private const int PlayerMaxHp = 80;
        private int _playerBlock = 0;
        private int _energy = 3;

        // Состояние Врага (Культист)
        private int _enemyHp = 50;
        private const int EnemyMaxHp = 50;
        private int _enemyBlock = 0;
        private int _enemyStrength = 0;
        private string _enemyIntentType = "Buff";
        private int _enemyIntentValue = 3;

        private int _turnCount = 0;
        private readonly Random _random = new Random();
        
        private readonly List<Card> _cardPool = new List<Card>();
        private readonly List<Card> _currentHand = new List<Card>();

        public MainWindow()
        {
            InitializeComponent();
            InitCardPool();
            StartBattle();
        }

        private void InitCardPool()
        {
            _cardPool.Add(new Card { Name = "Удар", Description = "Наносит 6 урона.", Cost = 1, Effect = () => DealDamageToEnemy(6) });
            _cardPool.Add(new Card { Name = "Защита", Description = "Дает 5 Брони.", Cost = 1, Effect = () => AddBlockToPlayer(5) });
            _cardPool.Add(new Card { Name = "Двойной Удар", Description = "Наносит 10 урона.", Cost = 2, Effect = () => DealDamageToEnemy(10) });
            _cardPool.Add(new Card { Name = "Покос", Description = "Наносит 4 урона и дает 3 Брони.", Cost = 1, Effect = () => { DealDamageToEnemy(4); AddBlockToPlayer(3); } });
        }

        private void StartBattle()
        {
            _playerHp = PlayerMaxHp;
            _enemyHp = EnemyMaxHp;
            _enemyStrength = 0;
            _turnCount = 0;
            TxtLog.Text = "Ваш ход! Культист готовится к ритуалу.";
            StartPlayerTurn();
        }

        private void StartPlayerTurn()
        {
            _turnCount++;
            _energy = 3;
            _playerBlock = 0;

            // Набираем карты
            _currentHand.Clear();
            for (int i = 0; i < 5; i++)
            {
                _currentHand.Add(_cardPool[_random.Next(_cardPool.Count)]);
            }

            DetermineEnemyIntent();
            UpdateUi();
            RedrawHand(); // Программный рендеринг руки
        }

        private void DetermineEnemyIntent()
        {
            if (_turnCount == 1)
            {
                _enemyIntentType = "Buff";
                _enemyIntentValue = 3;
                TxtEnemyIntent.Text = "Намерение: Ритуал (+3 к Силе каждый ход)";
                TxtEnemyIntent.Foreground = Brushes.Violet;
            }
            else
            {
                _enemyIntentType = "Attack";
                _enemyIntentValue = 6 + _enemyStrength;
                TxtEnemyIntent.Text = $"Намерение: Атака ({_enemyIntentValue} урона)";
                TxtEnemyIntent.Foreground = Brushes.OrangeRed;
            }
        }

        // Генерация UI элементов для карт вручную (взамен DataTemplate)
        private void RedrawHand()
        {
            HandPanel.Children.Clear();

            foreach (var card in _currentHand)
            {
                // Создаем кнопку-контейнер для карты
                Button cardButton = new Button
                {
                    Width = 130, Height = 180, Margin = new Thickness(10, 0, 10, 0),
                    Background = new SolidColorBrush(Color.FromRgb(42, 42, 58)),
                    Foreground = Brushes.White,
                    Tag = card // Сохраняем ссылку на объект карты внутрь кнопки
                };

                // Кастомный стиль и разметка внутренностей карты
                Grid cardGrid = new Grid { Padding = new Thickness(10) };
                cardGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
                cardGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
                cardGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });

                // Заголовок
                TextBlock txtName = new TextBlock { Text = card.Name, FontWeight = FontWeights.Bold, FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, TextAlignment = TextAlignment.Center };
                Grid.SetRow(txtName, 0);

                // Описание
                TextBlock txtDesc = new TextBlock { Text = card.Description, FontSize = 11, Foreground = Brushes.LightGray, TextWrapping = TextWrapping.Wrap, VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center, TextAlignment = TextAlignment.Center };
                Grid.SetRow(txtDesc, 1);

                // Энергия
                Border energyBorder = new Border { Background = new SolidColorBrush(Color.FromRgb(0, 255, 204)), Width = 24, Height = 24, CornerRadius = new CornerRadius(12), HorizontalAlignment = HorizontalAlignment.Center };
                TextBlock txtCost = new TextBlock { Text = card.Cost.ToString(), Foreground = Brushes.Black, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
                energyBorder.Child = txtCost;
                Grid.SetRow(energyBorder, 2);

                cardGrid.Children.Add(txtName);
                cardGrid.Children.Add(txtDesc);
                cardGrid.Children.Add(energyBorder);

                cardButton.Content = cardGrid;
                cardButton.Click += CardButton_Click; // Подписываем на событие клика

                HandPanel.Children.Add(cardButton);
            }
        }

        private void CardButton_Click(object sender, RoutedEventArgs e)
        {
            if (_enemyHp <= 0 || _playerHp <= 0) return;

            var button = sender as Button;
            var card = button?.Tag as Card; // Извлекаем логику карты из Tag

            if (card != null)
            {
                if (_energy >= card.Cost)
                {
                    _energy -= card.Cost;
                    card.Effect.Invoke();
                    _currentHand.Remove(card);
                    
                    UpdateUi();
                    RedrawHand(); // Перерисовываем руку после удаления карты
                    CheckWinCondition();
                }
                else
                {
                    TxtLog.Text = "Недостаточно энергии!";
                }
            }
        }

        private void BtnEndTurn_Click(object sender, RoutedEventArgs e)
        {
            if (_enemyHp <= 0 || _playerHp <= 0) return;

            _enemyBlock = 0;

            if (_enemyIntentType == "Buff")
            {
                _enemyStrength += _enemyIntentValue;
                TxtLog.Text = $"Культист кричит 'Вжик-вжик!' и получает +{_enemyIntentValue} к Силе!";
            }
            else if (_enemyIntentType == "Attack")
            {
                TakeDamagePlayer(_enemyIntentValue);
                TxtLog.Text = $"Культист атаковал вас на {_enemyIntentValue} урона!";
                _enemyStrength += 3; // Пассивка культиста расти на +3 после атаки
            }

            UpdateUi();

            if (_playerHp <= 0)
            {
                TxtLog.Text = "ВЫ ПОГИБЛИ. ИГРА ОКОНЧЕНА.";
                HandPanel.Children.Clear();
                return;
            }

            StartPlayerTurn();
        }

        private void DealDamageToEnemy(int amount)
        {
            if (_enemyBlock >= amount) _enemyBlock -= amount;
            else { amount -= _enemyBlock; _enemyBlock = 0; _enemyHp -= amount; if (_enemyHp < 0) _enemyHp = 0; }
        }

        private void TakeDamagePlayer(int amount)
        {
            if (_playerBlock >= amount) _playerBlock -= amount;
            else { amount -= _playerBlock; _playerBlock = 0; _playerHp -= amount; if (_playerHp < 0) _playerHp = 0; }
        }

        private void AddBlockToPlayer(int amount) => _playerBlock += amount;

        private void CheckWinCondition()
        {
            if (_enemyHp <= 0)
            {
                TxtLog.Text = "ПОБЕДА! Враг повержен.";
                HandPanel.Children.Clear();
            }
        }

        private void UpdateUi()
        {
            TxtPlayerHp.Text = $"HP: {_playerHp}/{PlayerMaxHp}";
            TxtPlayerBlock.Text = $"Броня: {_playerBlock}";
            TxtEnemyHp.Text = $"HP: {_enemyHp}/{EnemyMaxHp}";
            TxtEnemyBlock.Text = $"Броня: {_enemyBlock}";
            TxtEnergy.Text = $"Энергия: {_energy} / 3";
        }
    }
}