На этой неделе продолжил (и пока что закончил) рефакторинг. За счет этого быстро добавил карту, на реализацию которой раньше ушла бы куча времени.

Вводная инфа

Делаю коллекционную карточную PvP-игру на Unity и C#. Гитхаб.

Что сделал

Добавил карту с эффектом: "Сбросьте карту со своей руки. Если это атака, наносит 9 урона". То есть, карта может нанести или не нанести урон в зависимости от того, какую карту я сбросил со своей руки. Раньше я бы не знал, как это делать. А теперь у меня есть система ивентов, про реализацию которой я писал на прошлой неделе. Я просто проверяю тип карты из последнего ивента в стаке и на основе него решаю, исполнять ли нанесение урона:

if (cardManager.eventStack.Peek().Card.GetComponent<CardScript>().cardType == CardScript.CardType.Attack)
                {
                    cardScript.otherSide.DealDamage(cardScript.finalDamage);
                }
                cardScript.playerActionCompleted = true;
                break;

Из рефакторинга: теперь использую для хранения данных о каждой карте отдельный скрипт:

public class CardData : MonoBehaviour
{
    public Dictionary<string, Card> cardDictionary = new Dictionary<string, Card>();

    void Awake()
    {
        cardDictionary["BlueAttack1"] = new Card {Damage = 5 };
        cardDictionary["BlueAttack2"] = new Card { Mana = 1, Damage = 4, DrawCards = 2 };
        cardDictionary["BlueDefend1"] = new Card { Block = 6 };
        cardDictionary["RedAttack1"] = new Card { Damage = 6 };
        cardDictionary["RedAttack2"] = new Card { Damage = 12, Mana = 2 };
        cardDictionary["RedDefend1"] = new Card { Block = 5 };
        cardDictionary["RedPower1"] = new Card { GainStrength = 1, Mana = 1 };
        cardDictionary["GraySkill1"] = new Card { IsSpecial = true, DrawCards = 2 };
        cardDictionary["GraySkill2"] = new Card { AddCardBuff = 1 };
        cardDictionary["BlueAttack3"] = new Card { IsSpecial = true, Damage = 9, Mana = 1 };
        cardDictionary["BlueSkill1"] = new Card { IsSpecial = true, Mana = 1 };
    }
}

public class Card
{
    public int Mana = 0;
    public bool IsSpecial = false;
    public int Damage = 0;
    public int Block = 0;
    public int GainStrength = 0;
    public int GainDexterity = 0;
    public int DrawCards = 0;
    public int AddCardBuff = 0;
}

Знаю, что выглядит колхозно и тут вроде как должен быть более простой способ. Но раньше у меня вообще все характеристики вытаскивались из описания карты, хранящегося в таблице локализации, вот таким вот кривым образом. Мне это показалось наиболее простым, чтобы размечать в картах, где находится блок, где урон и т.д. :))

     if (cardDescriptionDynamic.Contains("["))
            {
                int firstSym = cardDescriptionDynamic.IndexOf('[');
                int secondSym = cardDescriptionDynamic.IndexOf(']');
                string damage = "";
                for (int i = firstSym + 1; i < secondSym; i++)
                {
                    damage += cardDescriptionDynamic[i];
                }
                cardDamage = Int32.Parse(damage);
                cardDescriptionDynamic = cardDescriptionDynamic.Replace("[", "");
                cardDescriptionDynamic = cardDescriptionDynamic.Replace("]", "");
                finalDamage = cardDamage + cardSide.Strength;
                cardDescriptionDynamic = cardDescriptionDynamic.Replace(damage, finalDamage.ToString());
                if (cardSide.Strength != 0)
                {
                    string coloredDamage = "<color=" + (cardSide.Strength > 0 ? "green" : "red") + ">" + finalDamage.ToString() + "</color>";
                    cardDescriptionDynamic = cardDescriptionDynamic.Replace(finalDamage.ToString(), coloredDamage);
                }
            }

Теперь это все с помощью переменных забивается в таблице локализации и подсвечивается при необходимости:


Этот пост входит в цикл постов про игру, которую я потихоньку делаю уже несколько месяцев. Я делюсь всем производственным процессом: какие решения я принимаю в разработке, геймдизайне, интерфейсе, арте и других сферах. Подписывайтесь тут или в телеграм-канале: @nigylam_blog.

Комментарии (0)