На этой неделе продолжил (и пока что закончил) рефакторинг. За счет этого быстро добавил карту, на реализацию которой раньше ушла бы куча времени.
Вводная инфа
Делаю коллекционную карточную 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.