One-on-one. Девлог. Карта со сложным кастомным эффектом
На этой неделе продолжил (и пока что закончил) рефакторинг. За счет этого быстро добавил карту, на реализацию которой раньше ушла бы куча времени.
Вводная инфа
Делаю коллекционную карточную PvP-игру на Unity и C#. Гитхаб.
Что сделал
Добавил карту с эффектом: «Сбросьте карту со своей руки. Если это атака, наносит 9 урона». То есть, карта может нанести или не нанести урон в зависимости от того, какую карту я сбросил со своей руки. Раньше я бы не знал, как это делать. А теперь у меня есть система ивентов, про реализацию которой я писал на прошлой неделе. Я просто проверяю тип карты из последнего ивента в стаке и на основе него решаю, исполнять ли нанесение урона:
if (cardManager.eventStack.Peek().Card.GetComponent().cardType == CardScript.CardType.Attack)
{
cardScript.otherSide.DealDamage(cardScript.finalDamage);
}
cardScript.playerActionCompleted = true;
break;
Из рефакторинга: теперь использую для хранения данных о каждой карте отдельный скрипт:
public class CardData : MonoBehaviour
{
public Dictionary cardDictionary = new Dictionary();
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 = " 0 ? "green" : "red") + ">" + finalDamage.ToString() + " ";
cardDescriptionDynamic = cardDescriptionDynamic.Replace(finalDamage.ToString(), coloredDamage);
}
}
Теперь это все с помощью переменных забивается в таблице локализации и подсвечивается при необходимости:
Этот пост входит в цикл постов про игру, которую я потихоньку делаю уже несколько месяцев. Я делюсь всем производственным процессом: какие решения я принимаю в разработке, геймдизайне, интерфейсе, арте и других сферах. Подписывайтесь тут или в телеграм-канале: @nigylam_blog.