One-on-one. Девлог. Карта со сложным кастомным эффектом

—

от автора

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

Вводная инфа

Делаю коллекционную карточную 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.


ссылка на оригинал статьи https://habr.com/ru/articles/768958/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *