示例#1
0
 /// <summary>
 /// If cards, buffs, equipments are removed from battle, just call this method to UnRegister all sideeffects of them
 /// </summary>
 /// <param name="sideEffects"></param>
 public void UnRegisterEvent(SideEffectBundle sideEffects)
 {
     foreach (SideEffectExecute see in sideEffects.SideEffectExecutes)
     {
         UnRegisterEvent(see);
     }
 }
示例#2
0
 /// <summary>
 /// Cards, equipments, buffs register their sideeffects
 /// </summary>
 /// <param name="sideEffectBundle"></param>
 public void RegisterEvent(SideEffectBundle sideEffectBundle)
 {
     foreach (SideEffectExecute see in sideEffectBundle.SideEffectExecutes)
     {
         RegisterEvent(see);
     }
 }
示例#3
0
 public CardInfo_Spell(int cardID, BaseInfo baseInfo, UpgradeInfo upgradeInfo, SideEffectBundle sideEffectBundle, SideEffectBundle sideEffectBundle_BattleGroundAura)
     : base(cardID: cardID,
            baseInfo: baseInfo,
            upgradeInfo: upgradeInfo,
            sideEffectBundle: sideEffectBundle,
            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura)
 {
     Pro_Initialize();
 }
示例#4
0
 protected CardInfo_Base(int cardID, BaseInfo baseInfo, UpgradeInfo upgradeInfo, SideEffectBundle sideEffectBundle, SideEffectBundle sideEffectBundle_BattleGroundAura)
 {
     CardID           = cardID;
     BaseInfo         = baseInfo;
     UpgradeInfo      = upgradeInfo;
     SideEffectBundle = sideEffectBundle;
     SideEffectBundle_BattleGroundAura = sideEffectBundle_BattleGroundAura;
     TargetInfo.Initialize(this);
     Pro_Initialize();
 }
示例#5
0
    public override CardInfo_Base Clone()
    {
        CardInfo_Spell cs = new CardInfo_Spell(
            cardID: CardID,
            baseInfo: BaseInfo,
            upgradeInfo: UpgradeInfo,
            sideEffectBundle: SideEffectBundle.Clone(),
            sideEffectBundle_BattleGroundAura: SideEffectBundle_BattleGroundAura.Clone());

        return(cs);
    }
示例#6
0
    public override CardInfo_Base Clone()
    {
        CardInfo_Mech cb = new CardInfo_Mech(
            cardID: CardID,
            baseInfo: BaseInfo,
            upgradeInfo: UpgradeInfo,
            lifeInfo: LifeInfo,
            battleInfo: BattleInfo,
            mechInfo: MechInfo,
            sideEffectBundle: SideEffectBundle.Clone(),
            sideEffectBundle_BattleGroundAura: SideEffectBundle_BattleGroundAura.Clone());

        return(cb);
    }
示例#7
0
    public override CardInfo_Base Clone()
    {
        CardInfo_Equip cb = new CardInfo_Equip(
            cardID: CardID,
            baseInfo: BaseInfo,
            upgradeInfo: UpgradeInfo,
            equipInfo: EquipInfo,
            weaponInfo: WeaponInfo,
            shieldInfo: ShieldInfo,
            packInfo: PackInfo,
            maInfo: MAInfo,
            sideEffectBundle: SideEffectBundle.Clone(),
            sideEffectBundle_BattleGroundAura: SideEffectBundle_BattleGroundAura.Clone()
            );

        return(cb);
    }
示例#8
0
    private void FindTargetInSideEffectBundle(SideEffectBundle seb, CardInfo_Base CardInfo)
    {
        foreach (SideEffectExecute see in seb.GetSideEffectExecutes(SideEffectExecute.TriggerTime.OnPlayCard, SideEffectExecute.TriggerRange.Self))
        {
            if (FindTarget(see))
            {
                break;
            }
        }

        foreach (SideEffectExecute see in seb.GetSideEffectExecutes(SideEffectExecute.TriggerTime.OnMechSummon, SideEffectExecute.TriggerRange.Self))
        {
            if (FindTarget(see))
            {
                break;
            }
        }
    }
示例#9
0
    public CardInfo_Equip(int cardID, BaseInfo baseInfo, UpgradeInfo upgradeInfo, EquipInfo equipInfo, WeaponInfo weaponInfo, ShieldInfo shieldInfo, PackInfo packInfo, MAInfo maInfo, SideEffectBundle sideEffectBundle, SideEffectBundle sideEffectBundle_BattleGroundAura)
        : base(cardID: cardID,
               baseInfo: baseInfo,
               upgradeInfo: upgradeInfo,
               sideEffectBundle: sideEffectBundle,
               sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura)
    {
        switch (equipInfo.SlotType)
        {
        case SlotTypes.Weapon:
        {
            WeaponInfo = weaponInfo;
            break;
        }

        case SlotTypes.Shield:
        {
            ShieldInfo = shieldInfo;
            break;
        }

        case SlotTypes.Pack:
        {
            PackInfo = packInfo;
            break;
        }

        case SlotTypes.MA:
        {
            MAInfo = maInfo;
            break;
        }
        }

        EquipInfo = equipInfo;
        Pro_Initialize();
    }
示例#10
0
 public CardInfo_Mech(int cardID, BaseInfo baseInfo, UpgradeInfo upgradeInfo, LifeInfo lifeInfo, BattleInfo battleInfo, MechInfo mechInfo, SideEffectBundle sideEffectBundle, SideEffectBundle sideEffectBundle_BattleGroundAura)
     : base(cardID: cardID,
            upgradeInfo: upgradeInfo,
            baseInfo: baseInfo,
            sideEffectBundle: sideEffectBundle,
            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura)
 {
     LifeInfo   = lifeInfo;
     BattleInfo = battleInfo;
     MechInfo   = mechInfo;
     Pro_Initialize();
 }
示例#11
0
    public void Initialize(CardInfo_Base cardInfo, SideEffectBundle seb, UnityAction onRefreshText)
    {
        foreach (CardPropertyForm_SideEffectExecute cpfsee in CardPropertyForm_SideEffectExecuteRows)
        {
            cpfsee.PoolRecycle();
        }

        CardPropertyForm_SideEffectExecuteRows.Clear();

        if (cardInfo != null)
        {
            if (seb == cardInfo.SideEffectBundle)
            {
                LanguageManager.Instance.RegisterTextKey(SideEffectBundleText, "CardEditorPanel_SideEffectBundleText");
            }
            else
            {
                LanguageManager.Instance.RegisterTextKey(SideEffectBundleText, "CardEditorPanel_SideEffectBundleAuraText");
            }

            AddSideEffectExecuteButton.onClick.RemoveAllListeners();
            AddSideEffectExecuteButton.onClick.AddListener(delegate
            {
                SideEffectExecute.SideEffectFrom sef            = SideEffectExecute.SideEffectFrom.Unknown;
                SideEffectExecute.ExecuteSetting executeSetting = SideEffectExecute.ExecuteSetting_Presets[SideEffectExecute.ExecuteSettingTypes.PlayOutEffect].Clone();

                switch (cardInfo.BaseInfo.CardType)
                {
                case CardTypes.Mech:
                    sef            = SideEffectExecute.SideEffectFrom.MechSideEffect;
                    executeSetting = SideEffectExecute.ExecuteSetting_Presets[SideEffectExecute.ExecuteSettingTypes.BattleCry];
                    break;

                case CardTypes.Equip:
                    sef            = SideEffectExecute.SideEffectFrom.EquipSideEffect;
                    executeSetting = SideEffectExecute.ExecuteSetting_Presets[SideEffectExecute.ExecuteSettingTypes.EquipBattleCry];
                    break;

                case CardTypes.Spell:
                    sef            = SideEffectExecute.SideEffectFrom.SpellCard;
                    executeSetting = SideEffectExecute.ExecuteSetting_Presets[SideEffectExecute.ExecuteSettingTypes.PlayOutEffect];
                    break;

                case CardTypes.Energy:
                    sef            = SideEffectExecute.SideEffectFrom.EnergyCard;
                    executeSetting = SideEffectExecute.ExecuteSetting_Presets[SideEffectExecute.ExecuteSettingTypes.PlayOutEffect];
                    break;
                    //todo from buff
                }

                SideEffectExecute newSEE = new SideEffectExecute(sef, new List <SideEffectBase> {
                    AllSideEffects.GetSideEffect("Damage").Clone()
                }, executeSetting);

                seb.AddSideEffectExecute(newSEE);
                seb.RefreshSideEffectExecutesDict();
                Initialize(cardInfo, seb, onRefreshText);
                onRefreshText();
                StartCoroutine(ClientUtils.UpdateLayout((RectTransform)UIManager.Instance.GetBaseUIForm <CardEditorPanel>().CardPropertiesContainer));
            });

            RefreshSideEffectBundleTransformButton.onClick.RemoveAllListeners();
            RefreshSideEffectBundleTransformButton.onClick.AddListener(delegate { StartCoroutine(ClientUtils.UpdateLayout((RectTransform)UIManager.Instance.GetBaseUIForm <CardEditorPanel>().CardPropertiesContainer)); }
                                                                       );

            foreach (SideEffectExecute see in seb.SideEffectExecutes)
            {
                CardPropertyForm_SideEffectExecute cpfsee = GameObjectPoolManager.Instance.PoolDict[GameObjectPoolManager.PrefabNames.CardPropertyForm_SideEffectExecute].AllocateGameObject <CardPropertyForm_SideEffectExecute>(SideEffectExecuteRowContainer);
                cpfsee.Initialize(SideEffectExecute.GetSideEffectFromByCardType(cardInfo.BaseInfo.CardType), see, onRefreshText, delegate
                {
                    seb.RemoveSideEffectExecute(see);
                    Initialize(cardInfo, seb, onRefreshText);
                    onRefreshText();
                    StartCoroutine(ClientUtils.UpdateLayout((RectTransform)SideEffectExecuteRowContainer));
                });
                CardPropertyForm_SideEffectExecuteRows.Add(cpfsee);
            }
        }
    }
示例#12
0
    private static void GetAffixTypeFromSideEffectBundle(HashSet <AffixType> affixTypes, SideEffectBundle seb)
    {
        foreach (SideEffectExecute see in seb.GetSideEffectExecutes(SideEffectExecute.TriggerTime.OnPlayCard, SideEffectExecute.TriggerRange.Self))
        {
            foreach (SideEffectBase se in see.SideEffectBases)
            {
                if (se is Exile_Base)
                {
                    affixTypes.Add(AffixType.Disposable);
                }
            }
        }

        if (seb.GetSideEffectExecutes(SideEffectExecute.TriggerTime.OnMechDie, SideEffectExecute.TriggerRange.Self).Count != 0)
        {
            affixTypes.Add(AffixType.Die);
        }

        if (seb.GetSideEffectExecutes(SideEffectExecute.TriggerTime.OnMechSummon, SideEffectExecute.TriggerRange.Self).Count != 0)
        {
            affixTypes.Add(AffixType.BattleCry);
        }
    }
示例#13
0
    private static void ExtractSideEffectBundle(CardTypes cardType, XmlNode node_CardInfo, SideEffectBundle seb)
    {
        SideEffectExecute.SideEffectFrom sideEffectFrom = SideEffectExecute.SideEffectFrom.Unknown;
        switch (cardType)
        {
        case CardTypes.Mech:
            sideEffectFrom = SideEffectExecute.SideEffectFrom.MechSideEffect;
            break;

        case CardTypes.Equip:
            sideEffectFrom = SideEffectExecute.SideEffectFrom.EquipSideEffect;
            break;

        case CardTypes.Spell:
            sideEffectFrom = SideEffectExecute.SideEffectFrom.SpellCard;
            break;

        case CardTypes.Energy:
            sideEffectFrom = SideEffectExecute.SideEffectFrom.EnergyCard;
            break;
        }

        for (int k = 0; k < node_CardInfo.ChildNodes.Count; k++)
        {
            XmlNode node_SideEffectExecute      = node_CardInfo.ChildNodes.Item(k);
            SideEffectExecute.ExecuteSetting es = SideEffectExecute.ExecuteSetting.GenerateFromXMLNode(node_SideEffectExecute);

            List <SideEffectBase> ses = new List <SideEffectBase>();

            for (int m = 0; m < node_SideEffectExecute.ChildNodes.Count; m++)
            {
                XmlNode        node_SideEffect = node_SideEffectExecute.ChildNodes.Item(m);
                SideEffectBase sideEffect      = AllSideEffects.SideEffectsNameDict[node_SideEffect.Attributes["name"].Value].Clone();
                GetInfoForSideEffect(node_SideEffect, sideEffect);
                ses.Add(sideEffect);
            }

            SideEffectExecute see = new SideEffectExecute(sideEffectFrom, ses, es);
            seb.AddSideEffectExecute(see);
        }
    }
示例#14
0
    public static void AddAllCards()
    {
        Reset();
        SortedDictionary <string, string> cardNameKeyDict = new SortedDictionary <string, string>();

        foreach (int v in Enum.GetValues(typeof(LanguageShorts)))
        {
            string strName = Enum.GetName(typeof(LanguageShorts), v);
            cardNameKeyDict[strName] = "cardName_" + strName;
        }

        string text;

        using (StreamReader sr = new StreamReader(CardsXMLFile))
        {
            text = sr.ReadToEnd();
        }

        XmlDocument doc = new XmlDocument();

        doc.LoadXml(text);
        XmlElement node_AllCards = doc.DocumentElement;

        for (int i = 0; i < node_AllCards.ChildNodes.Count; i++)
        {
            XmlNode node_Card = node_AllCards.ChildNodes.Item(i);
            int     cardID    = int.Parse(node_Card.Attributes["id"].Value);
            CardDict.Add(cardID, new CardInfo_Base());
        }

        for (int i = 0; i < node_AllCards.ChildNodes.Count; i++)
        {
            XmlNode node_Card = node_AllCards.ChildNodes.Item(i);

            int cardID = int.Parse(node_Card.Attributes["id"].Value);

            BaseInfo    baseInfo    = new BaseInfo();
            UpgradeInfo upgradeInfo = new UpgradeInfo();
            LifeInfo    lifeInfo    = new LifeInfo();
            BattleInfo  battleInfo  = new BattleInfo();
            MechInfo    mechInfo    = new MechInfo();
            EquipInfo   equipInfo   = new EquipInfo();
            WeaponInfo  weaponInfo  = new WeaponInfo();
            ShieldInfo  shieldInfo  = new ShieldInfo();
            PackInfo    packInfo    = new PackInfo();
            MAInfo      maInfo      = new MAInfo();

            SideEffectBundle sideEffectBundle = new SideEffectBundle();
            SideEffectBundle sideEffectBundle_BattleGroundAura = new SideEffectBundle();

            for (int j = 0; j < node_Card.ChildNodes.Count; j++)
            {
                XmlNode node_CardInfo = node_Card.ChildNodes[j];
                switch (node_CardInfo.Attributes["name"].Value)
                {
                case "baseInfo":
                    SortedDictionary <string, string> cardNameDict = new SortedDictionary <string, string>();
                    foreach (KeyValuePair <string, string> kv in cardNameKeyDict)
                    {
                        string cardName = node_CardInfo.Attributes[kv.Value].Value;
                        cardNameDict[kv.Key] = cardName;
                    }

                    baseInfo = new BaseInfo(
                        pictureID: int.Parse(node_CardInfo.Attributes["pictureID"].Value),
                        cardNames: cardNameDict,
                        isTemp: node_CardInfo.Attributes["isTemp"].Value == "True",
                        isHide: node_CardInfo.Attributes["isHide"].Value == "True",
                        metal: int.Parse(node_CardInfo.Attributes["metal"].Value),
                        energy: int.Parse(node_CardInfo.Attributes["energy"].Value),
                        coin: int.Parse(node_CardInfo.Attributes["coin"].Value),
                        effectFactor: 1,
                        limitNum: int.Parse(node_CardInfo.Attributes["limitNum"].Value),
                        cardRareLevel: int.Parse(node_CardInfo.Attributes["cardRareLevel"].Value),
                        shopPrice: int.Parse(node_CardInfo.Attributes["shopPrice"].Value),
                        cardType: (CardTypes)Enum.Parse(typeof(CardTypes), node_CardInfo.Attributes["cardType"].Value));
                    break;

                case "upgradeInfo":
                    int u_id = int.Parse(node_CardInfo.Attributes["upgradeCardID"].Value);
                    int d_id = int.Parse(node_CardInfo.Attributes["degradeCardID"].Value);
                    upgradeInfo = new UpgradeInfo(
                        upgradeCardID: u_id,
                        degradeCardID: d_id,
                        cardLevel: 1,
                        cardLevelMax: 1);
                    break;

                case "lifeInfo":
                    lifeInfo = new LifeInfo(
                        life: int.Parse(node_CardInfo.Attributes["life"].Value),
                        totalLife: int.Parse(node_CardInfo.Attributes["totalLife"].Value));
                    break;

                case "battleInfo":
                    battleInfo = new BattleInfo(
                        basicAttack: int.Parse(node_CardInfo.Attributes["basicAttack"].Value),
                        basicArmor: int.Parse(node_CardInfo.Attributes["basicArmor"].Value),
                        basicShield: int.Parse(node_CardInfo.Attributes["basicShield"].Value));
                    break;

                case "mechInfo":
                    mechInfo = new MechInfo(
                        isSoldier: node_CardInfo.Attributes["isSoldier"].Value == "True",
                        isDefense: node_CardInfo.Attributes["isDefense"].Value == "True",
                        isSniper: node_CardInfo.Attributes["isSniper"].Value == "True",
                        isCharger: node_CardInfo.Attributes["isCharger"].Value == "True",
                        isFrenzy: node_CardInfo.Attributes["isFrenzy"].Value == "True",
                        isSentry: node_CardInfo.Attributes["isSentry"].Value == "True",
                        slot1: (SlotTypes)Enum.Parse(typeof(SlotTypes), node_CardInfo.Attributes["slot1"].Value),
                        slot2: (SlotTypes)Enum.Parse(typeof(SlotTypes), node_CardInfo.Attributes["slot2"].Value),
                        slot3: (SlotTypes)Enum.Parse(typeof(SlotTypes), node_CardInfo.Attributes["slot3"].Value),
                        slot4: (SlotTypes)Enum.Parse(typeof(SlotTypes), node_CardInfo.Attributes["slot4"].Value));
                    break;

                case "weaponInfo":
                    weaponInfo = new WeaponInfo(
                        energy: int.Parse(node_CardInfo.Attributes["energy"].Value),
                        energyMax: int.Parse(node_CardInfo.Attributes["energyMax"].Value),
                        attack: int.Parse(node_CardInfo.Attributes["attack"].Value),
                        weaponType: (WeaponTypes)Enum.Parse(typeof(WeaponTypes), node_CardInfo.Attributes["weaponType"].Value),
                        isSentry: node_CardInfo.Attributes["isSentry"].Value == "True",
                        isFrenzy: node_CardInfo.Attributes["isFrenzy"].Value == "True");
                    equipInfo = new EquipInfo(SlotTypes.Weapon);
                    break;

                case "shieldInfo":
                    shieldInfo = new ShieldInfo(
                        armor: int.Parse(node_CardInfo.Attributes["armor"].Value),
                        shield: int.Parse(node_CardInfo.Attributes["shield"].Value),
                        shieldType: (ShieldTypes)Enum.Parse(typeof(ShieldTypes), node_CardInfo.Attributes["shieldType"].Value),
                        isDefense: node_CardInfo.Attributes["isDefense"].Value == "True");
                    equipInfo = new EquipInfo(SlotTypes.Shield);
                    break;

                case "packInfo":
                    packInfo = new PackInfo(
                        isFrenzy: node_CardInfo.Attributes["isFrenzy"].Value == "True",
                        isDefense: node_CardInfo.Attributes["isDefense"].Value == "True",
                        isSniper: node_CardInfo.Attributes["isSniper"].Value == "True"
                        );
                    equipInfo = new EquipInfo(SlotTypes.Pack);
                    break;

                case "maInfo":
                    maInfo = new MAInfo(
                        isFrenzy: node_CardInfo.Attributes["isFrenzy"].Value == "True",
                        isDefense: node_CardInfo.Attributes["isDefense"].Value == "True",
                        isSniper: node_CardInfo.Attributes["isSniper"].Value == "True"
                        );
                    equipInfo = new EquipInfo(SlotTypes.MA);
                    break;

                case "sideEffectsBundle":
                {
                    ExtractSideEffectBundle(baseInfo.CardType, node_CardInfo, sideEffectBundle);
                    break;
                }

                case "sideEffectsBundle_Aura":
                {
                    ExtractSideEffectBundle(baseInfo.CardType, node_CardInfo, sideEffectBundle_BattleGroundAura);
                    break;
                }
                }
            }

            switch (baseInfo.CardType)
            {
            case CardTypes.Mech:
                addCard(new CardInfo_Mech(
                            cardID: cardID,
                            baseInfo: baseInfo,
                            upgradeInfo: upgradeInfo,
                            lifeInfo: lifeInfo,
                            battleInfo: battleInfo,
                            mechInfo: mechInfo,
                            sideEffectBundle: sideEffectBundle,
                            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura));
                break;

            case CardTypes.Equip:
                addCard(new CardInfo_Equip(
                            cardID: cardID,
                            baseInfo: baseInfo,
                            upgradeInfo: upgradeInfo,
                            equipInfo: equipInfo,
                            weaponInfo: weaponInfo,
                            shieldInfo: shieldInfo,
                            packInfo: packInfo,
                            maInfo: maInfo,
                            sideEffectBundle: sideEffectBundle,
                            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura));
                break;

            case CardTypes.Spell:
                addCard(new CardInfo_Spell(
                            cardID: cardID,
                            baseInfo: baseInfo,
                            upgradeInfo: upgradeInfo,
                            sideEffectBundle: sideEffectBundle,
                            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura));
                break;

            case CardTypes.Energy:
                addCard(new CardInfo_Spell(
                            cardID: cardID,
                            baseInfo: baseInfo,
                            upgradeInfo: upgradeInfo,
                            sideEffectBundle: sideEffectBundle,
                            sideEffectBundle_BattleGroundAura: sideEffectBundle_BattleGroundAura));
                break;
            }
        }

        // Check all upgradeID and degradeID valid in library
        foreach (KeyValuePair <int, CardInfo_Base> kv in CardDict)
        {
            int uid = kv.Value.UpgradeInfo.UpgradeCardID;
            int did = kv.Value.UpgradeInfo.DegradeCardID;

            if (uid != -1)
            {
                if (!CardDict.ContainsKey(uid))
                {
                    kv.Value.UpgradeInfo.UpgradeCardID = -1;
                    NeedReload = true;
                }
            }

            if (did != -1)
            {
                if (!CardDict.ContainsKey(did))
                {
                    kv.Value.UpgradeInfo.DegradeCardID = -1;
                    NeedReload = true;
                }
            }
        }

        //TODO  Check all id in SE

        // Make all upgradeID and degradeID linked
        foreach (KeyValuePair <int, CardInfo_Base> kv in CardDict)
        {
            int uid = kv.Value.UpgradeInfo.UpgradeCardID;
            int did = kv.Value.UpgradeInfo.DegradeCardID;

            if (uid != -1)
            {
                CardInfo_Base uCard = CardDict[uid];
                if (uCard.UpgradeInfo.DegradeCardID != kv.Key)
                {
                    if (uCard.UpgradeInfo.DegradeCardID == -1)
                    {
                        uCard.UpgradeInfo.DegradeCardID = kv.Key;
                    }
                    else
                    {
                        CardInfo_Base uCard_ori_dCard = CardDict[uCard.UpgradeInfo.DegradeCardID];
                        if (uCard_ori_dCard.UpgradeInfo.UpgradeCardID == uCard.CardID)
                        {
                            kv.Value.UpgradeInfo.UpgradeCardID = -1;
                        }
                        else
                        {
                            uCard.UpgradeInfo.DegradeCardID = kv.Key;
                        }
                    }

                    NeedReload = true;
                }
            }

            if (did != -1)
            {
                CardInfo_Base dCard = CardDict[did];
                if (dCard.UpgradeInfo.UpgradeCardID != kv.Key)
                {
                    if (dCard.UpgradeInfo.UpgradeCardID == -1)
                    {
                        dCard.UpgradeInfo.UpgradeCardID = kv.Key;
                    }
                    else
                    {
                        CardInfo_Base dCard_ori_uCard = CardDict[dCard.UpgradeInfo.UpgradeCardID];
                        if (dCard_ori_uCard.UpgradeInfo.DegradeCardID == dCard.CardID)
                        {
                            kv.Value.UpgradeInfo.DegradeCardID = -1;
                        }
                        else
                        {
                            dCard.UpgradeInfo.UpgradeCardID = kv.Key;
                        }
                    }

                    NeedReload = true;
                }
            }
        }

        // Check Series valid, no cycle
        foreach (KeyValuePair <int, CardInfo_Base> kv in CardDict)
        {
            List <int> cardSeries   = GetCardSeries(kv.Key);
            int        cardLevelMax = cardSeries.Count;
            kv.Value.UpgradeInfo.CardLevelMax = cardLevelMax;
            int cardLevel = 0;
            foreach (int cardID in cardSeries)
            {
                cardLevel++;
                if (cardID == kv.Key)
                {
                    break;
                }
            }

            kv.Value.UpgradeInfo.CardLevel = cardLevel;
        }

        //If any problem, refresh XML and reload
        if (NeedReload)
        {
            NeedReload = false;
            RefreshAllCardXML();
            ReloadCardXML();
        }
    }