using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.Netcode;
using UnityEngine;
namespace TcgEngine
{
///
/// Contain UserData retrieved from the web api database
///
[System.Serializable]
public class UserData
{
public string id;
public string username;
public string email;
public string avatar;
public string cardback;
public int permission_level = 1;
public int validation_level = 1;
public int coins;
public int xp;
public int elo;
public int matches;
public int victories;
public int defeats;
public UserCardData[] cards;
public UserCardData[] packs;
public UserDeckData[] decks;
public string[] rewards;
public string[] avatars;
public string[] cardbacks;
public string[] friends;
public UserData()
{
cards = new UserCardData[0];
packs = new UserCardData[0];
decks = new UserDeckData[0];
rewards = new string[0];
avatars = new string[0];
cardbacks = new string[0];
friends = new string[0];
permission_level = 1;
coins = 10000;
elo = 1000;
}
public int GetLevel()
{
return Mathf.FloorToInt(xp / 1000) + 1;
}
public float GetLevelProgress()
{
int currentLeve = GetLevel();
int baseXp = (currentLeve - 1) * 1000;
Debug.LogError(xp);
// 距离下一级还需多少经验值
int xpIntoCurrentLevel = xp - baseXp;
return (float)xpIntoCurrentLevel / 1000f;
}
public string GetAvatar()
{
if (avatar != null)
return avatar;
return "";
}
public string GetCardback()
{
if (cardback != null)
return cardback;
return "";
}
public void SetDeck(UserDeckData deck)
{
for(int i=0; i ldecks = new List(decks);
ldecks.Add(deck);
this.decks = ldecks.ToArray();
}
public UserDeckData GetDeck(string tid)
{
foreach (UserDeckData deck in decks)
{
if (deck.tid == tid)
return deck;
}
return null;
}
public UserCardData GetCard(string tid, string variant)
{
foreach (UserCardData card in cards)
{
if (card.tid == tid && card.variant == variant)
return card;
}
return null;
}
public int GetCardQuantity(CardData card, VariantData variant)
{
return GetCardQuantity(card.id, variant.id, variant.is_default);
}
public int GetCardQuantity(string tid, string variant, bool default_variant = false)
{
if (cards == null)
return 0;
foreach (UserCardData card in cards)
{
if (card.tid == tid && card.variant == variant)
return card.quantity;
if (card.tid == tid && card.variant == "" && default_variant)
return card.quantity;
}
return 0;
}
public UserCardData GetPack(string tid)
{
foreach (UserCardData pack in packs)
{
if (pack.tid == tid)
return pack;
}
return null;
}
public int GetPackQuantity(string tid)
{
if (packs == null)
return 0;
foreach (UserCardData pack in packs)
{
if (pack.tid == tid)
return pack.quantity;
}
return 0;
}
public int CountUniqueCards()
{
if (cards == null)
return 0;
HashSet unique_cards = new HashSet();
foreach (UserCardData card in cards)
{
if (!unique_cards.Contains(card.tid))
unique_cards.Add(card.tid);
}
return unique_cards.Count;
}
public int CountCardType(VariantData variant)
{
int value = 0;
foreach (UserCardData card in cards)
{
if (card.variant == variant.id)
value += 1;
}
return value;
}
public bool HasDeckCards(UserDeckData deck)
{
foreach (UserCardData card in deck.cards)
{
bool default_variant = true; //Count "" variant as valid for compatibilty with older vers
if (GetCardQuantity(card.tid, card.variant, default_variant) < card.quantity)
return false;
}
return true;
}
public bool IsDeckValid(UserDeckData deck)
{
if (Authenticator.Get().IsApi())
return HasDeckCards(deck) && deck.IsValid();
return deck.IsValid();
}
public void AddDeck(UserDeckData deck)
{
List udecks = new List(decks);
udecks.Add(deck);
decks = udecks.ToArray();
foreach (UserCardData card in deck.cards)
{
AddCard(card.tid, card.variant, 1);
}
}
public void AddPack(string tid, int quantity)
{
bool found = false;
foreach (UserCardData pack in packs)
{
if (pack.tid == tid)
{
found = true;
pack.quantity += quantity;
}
}
if (!found)
{
UserCardData npack = new UserCardData();
npack.tid = tid;
npack.quantity = quantity;
List apacks = new List(packs);
apacks.Add(npack);
packs = apacks.ToArray();
}
}
public void AddCard(string tid, string variant, int quantity)
{
bool found = false;
foreach (UserCardData card in cards)
{
if (card.tid == tid && card.variant == variant)
{
found = true;
card.quantity += quantity;
}
}
if (!found)
{
UserCardData ncard = new UserCardData();
ncard.tid = tid;
ncard.variant = variant;
ncard.quantity = quantity;
List acards = new List(cards);
acards.Add(ncard);
cards = acards.ToArray();
}
}
public void AddReward(string tid)
{
if (!HasReward(tid))
{
List arewards = new List(rewards);
arewards.Add(tid);
rewards = arewards.ToArray();
}
}
public bool HasCard(string card_tid, string variant, int quantity = 1)
{
foreach (UserCardData card in cards)
{
if (card.tid == card_tid && card.variant == variant && card.quantity >= quantity)
return true;
}
return false;
}
public bool HasPack(string pack_tid, int quantity=1)
{
foreach (UserCardData pack in packs)
{
if (pack.tid == pack_tid && pack.quantity >= quantity)
return true;
}
return false;
}
public bool HasAvatar(string avatar_tid)
{
return avatars.Contains(avatar_tid);
}
public bool HasCardback(string cardback_tid)
{
return cardbacks.Contains(cardback_tid);
}
public bool HasReward(string reward_id)
{
foreach (string reward in rewards)
{
if (reward == reward_id)
return true;
}
return false;
}
public string GetCoinsString()
{
return coins.ToString();
}
public bool HasFriend(string username)
{
List flist = new List(friends);
return flist.Contains(username);
}
public void AddFriend(string username)
{
List flist = new List(friends);
if (!flist.Contains(username))
flist.Add(username);
friends = flist.ToArray();
}
public void RemoveFriend(string username)
{
List flist = new List(friends);
if (flist.Contains(username))
flist.Remove(username);
friends = flist.ToArray();
}
}
[System.Serializable]
public class UserDeckData : INetworkSerializable
{
public string tid;
public string title;
public UserCardData hero;
public UserCardData[] cards;
public UserDeckData() {}
public UserDeckData(string tid, string title)
{
this.tid = tid;
this.title = title;
hero = new UserCardData();
cards = new UserCardData[0];
}
public UserDeckData(DeckData deck)
{
tid = deck.id;
title = deck.title;
hero = new UserCardData(deck.hero, VariantData.GetDefault());
cards = new UserCardData[deck.cards.Length];
for (int i = 0; i < deck.cards.Length; i++)
{
cards[i] = new UserCardData(deck.cards[i], VariantData.GetDefault());
}
}
public int GetQuantity()
{
int count = 0;
foreach (UserCardData card in cards)
count += card.quantity;
return count;
}
public bool IsValid()
{
return !string.IsNullOrEmpty(tid) && !string.IsNullOrWhiteSpace(title) && GetQuantity() >= GameplayData.Get().deck_size;
}
public void NetworkSerialize(BufferSerializer serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref tid);
serializer.SerializeValue(ref title);
serializer.SerializeValue(ref hero);
NetworkTool.NetSerializeArray(serializer, ref cards);
}
public static UserDeckData Default
{
get
{
UserDeckData deck = new UserDeckData();
deck.tid = "";
deck.title = "";
deck.hero = new UserCardData();
deck.cards = new UserCardData[0];
return deck;
}
}
}
[System.Serializable]
public class UserCardData : INetworkSerializable
{
public string tid;
public string variant;
public int quantity;
public UserCardData() { tid = ""; variant = ""; quantity = 1; }
public UserCardData(string id, string v) { tid = id; variant = v; quantity = 1; }
public UserCardData(CardData card, VariantData variant)
{
this.tid = card != null ? card.id : "";
this.variant = variant != null ? variant.id : "";
this.quantity = 1;
}
public void NetworkSerialize(BufferSerializer serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref tid);
serializer.SerializeValue(ref variant);
serializer.SerializeValue(ref quantity);
}
}
}