This commit is contained in:
yaoyanwei
2025-08-04 16:45:48 +08:00
parent 565aa16389
commit 2f2a601227
2296 changed files with 522745 additions and 93 deletions

View File

@@ -0,0 +1,316 @@
using System.Collections.Generic;
using UnityEngine;
namespace TcgEngine
{
public enum CardType
{
None = 0,
Hero = 5,
Character = 10,
Spell = 20,
Artifact = 30,
Secret = 40,
Equipment = 50,
}
/// <summary>
/// Defines all card data
/// </summary>
[CreateAssetMenu(fileName = "card", menuName = "TcgEngine/CardData", order = 5)]
public class CardData : ScriptableObject
{
public string id;
[Header("Display")]
public string title;
public Sprite art_full;
public Sprite art_board;
[Header("Stats")]
public CardType type;
public TeamData team;
public RarityData rarity;
public int mana;
public int attack;
public int hp;
[Header("Traits")]
public TraitData[] traits;
public TraitStat[] stats;
[Header("Abilities")]
public AbilityData[] abilities;
[Header("Card Text")]
[TextArea(3, 5)]
public string text;
[Header("Description")]
[TextArea(5, 10)]
public string desc;
[Header("FX")]
public GameObject spawn_fx;
public GameObject death_fx;
public GameObject attack_fx;
public GameObject damage_fx;
public GameObject idle_fx;
public AudioClip spawn_audio;
public AudioClip death_audio;
public AudioClip attack_audio;
public AudioClip damage_audio;
[Header("Availability")]
public bool deckbuilding = false;
public int cost = 100;
public PackData[] packs;
public static List<CardData> card_list = new List<CardData>(); //Faster access in loops
public static Dictionary<string, CardData> card_dict = new Dictionary<string, CardData>(); //Faster access in Get(id)
public static void Load(string folder = "")
{
if (card_list.Count == 0)
{
card_list.AddRange(Resources.LoadAll<CardData>(folder));
foreach (CardData card in card_list)
card_dict.Add(card.id, card);
}
}
public Sprite GetBoardArt(VariantData variant)
{
return art_board;
}
public Sprite GetFullArt(VariantData variant)
{
return art_full;
}
public string GetTitle()
{
return title;
}
public string GetText()
{
return text;
}
public string GetDesc()
{
return desc;
}
public string GetTypeId()
{
if (type == CardType.Hero)
return "hero";
if (type == CardType.Character)
return "character";
if (type == CardType.Artifact)
return "artifact";
if (type == CardType.Spell)
return "spell";
if (type == CardType.Secret)
return "secret";
if (type == CardType.Equipment)
return "equipment";
return "";
}
public string GetAbilitiesDesc()
{
string txt = "";
foreach (AbilityData ability in abilities)
{
if (!string.IsNullOrWhiteSpace(ability.desc))
txt += "<b>" + ability.GetTitle() + ":</b> " + ability.GetDesc(this) + "\n";
}
return txt;
}
public bool IsCharacter()
{
return type == CardType.Character;
}
public bool IsSecret()
{
return type == CardType.Secret;
}
public bool IsBoardCard()
{
return type == CardType.Character || type == CardType.Artifact;
}
public bool IsRequireTarget()
{
return type == CardType.Equipment || IsRequireTargetSpell();
}
public bool IsRequireTargetSpell()
{
return type == CardType.Spell && HasAbility(AbilityTrigger.OnPlay, AbilityTarget.PlayTarget);
}
public bool IsEquipment()
{
return type == CardType.Equipment;
}
public bool IsDynamicManaCost()
{
return mana > 99;
}
public bool HasTrait(string trait)
{
foreach (TraitData t in traits)
{
if (t.id == trait)
return true;
}
return false;
}
public bool HasTrait(TraitData trait)
{
if(trait != null)
return HasTrait(trait.id);
return false;
}
public bool HasStat(string trait)
{
if (stats == null)
return false;
foreach (TraitStat stat in stats)
{
if (stat.trait.id == trait)
return true;
}
return false;
}
public bool HasStat(TraitData trait)
{
if(trait != null)
return HasStat(trait.id);
return false;
}
public int GetStat(string trait_id)
{
if (stats == null)
return 0;
foreach (TraitStat stat in stats)
{
if (stat.trait.id == trait_id)
return stat.value;
}
return 0;
}
public int GetStat(TraitData trait)
{
if(trait != null)
return GetStat(trait.id);
return 0;
}
public bool HasAbility(AbilityData tability)
{
foreach (AbilityData ability in abilities)
{
if (ability && ability.id == tability.id)
return true;
}
return false;
}
public bool HasAbility(AbilityTrigger trigger)
{
foreach (AbilityData ability in abilities)
{
if (ability && ability.trigger == trigger)
return true;
}
return false;
}
public bool HasAbility(AbilityTrigger trigger, AbilityTarget target)
{
foreach (AbilityData ability in abilities)
{
if (ability && ability.trigger == trigger && ability.target == target)
return true;
}
return false;
}
public AbilityData GetAbility(AbilityTrigger trigger)
{
foreach (AbilityData ability in abilities)
{
if (ability && ability.trigger == trigger)
return ability;
}
return null;
}
public bool HasPack(PackData pack)
{
foreach (PackData apack in packs)
{
if (apack == pack)
return true;
}
return false;
}
public static CardData Get(string id)
{
if (id == null)
return null;
bool success = card_dict.TryGetValue(id, out CardData card);
if (success)
return card;
return null;
}
public static List<CardData> GetAllDeckbuilding()
{
List<CardData> multi_list = new List<CardData>();
foreach (CardData acard in GetAll())
{
if (acard.deckbuilding)
multi_list.Add(acard);
}
return multi_list;
}
public static List<CardData> GetAll(PackData pack)
{
List<CardData> multi_list = new List<CardData>();
foreach (CardData acard in GetAll())
{
if (acard.HasPack(pack))
multi_list.Add(acard);
}
return multi_list;
}
public static List<CardData> GetAll()
{
return card_list;
}
}
}