Пример #1
0
 public TriadCard(int id, string name, string iconPath, ETriadCardRarity rarity, ETriadCardType type, int numUp, int numDown, int numLeft, int numRight, int sortKey)
 {
     Id       = id;
     Name     = name;
     IconPath = iconPath;
     Rarity   = rarity;
     Type     = type;
     Sides    = new int[4] {
         numUp, numLeft, numDown, numRight
     };
     SameNumberId = -1;
     SortKey      = sortKey;
 }
Пример #2
0
        private bool TryParseCardType(string desc, out ETriadCardType foundType)
        {
            if (!string.IsNullOrEmpty(desc))
            {
                foreach (ETriadCardType testType in Enum.GetValues(typeof(ETriadCardType)))
                {
                    if (testType.ToString().Equals(desc, StringComparison.InvariantCultureIgnoreCase))
                    {
                        foundType = testType;
                        return(true);
                    }
                }
            }

            foundType = ETriadCardType.None;
            return(false);
        }
Пример #3
0
        public TriadCard(int id, string iconPath, ETriadCardRarity rarity, ETriadCardType type, int numUp, int numDown, int numLeft, int numRight, int sortOrder, int group)
        {
            Id       = id;
            Name     = LocalizationDB.Get().FindOrAddLocString(ELocStringType.CardName, id);
            IconPath = iconPath;
            Rarity   = rarity;
            Type     = type;
            Sides    = new int[4] {
                numUp, numLeft, numDown, numRight
            };
            SameNumberId = -1;
            SortOrder    = sortOrder;
            Group        = group;

            if (group != 0 && SortOrder < 1000)
            {
                SortOrder += 1000;
            }
        }
Пример #4
0
        public TriadCard(int id, string name, string iconPath, ETriadCardRarity rarity, ETriadCardType type, int numUp, int numDown, int numLeft, int numRight, int sortOrder, int group)
        {
            Id       = id;
            Name     = name;
            IconPath = iconPath;
            Rarity   = rarity;
            Type     = type;
            Sides    = new int[4] {
                numUp, numLeft, numDown, numRight
            };
            SameNumberId = -1;
            SortOrder    = sortOrder;
            Group        = group;

            if (group != 0 && SortOrder < 1000)
            {
                SortOrder += 1000;
            }
        }
Пример #5
0
        public bool Load()
        {
            List <TriadCard> loadedCards = new List <TriadCard>();
            int maxLoadedId = 0;

            try
            {
                XmlDocument xdoc       = new XmlDocument();
                Stream      dataStream = AssetManager.Get().GetAsset(DBPath);
                xdoc.Load(dataStream);

                foreach (XmlNode cardNode in xdoc.DocumentElement.ChildNodes)
                {
                    XmlElement cardElem = (XmlElement)cardNode;
                    if (cardElem != null && cardElem.Name == "card")
                    {
                        try
                        {
                            ETriadCardRarity cardRarity = ETriadCardRarity.Common;
                            ETriadCardType   cardType   = ETriadCardType.None;
                            bool             bHasRarity = TryParseCardRarity(cardElem.GetAttribute("rarity"), out cardRarity);
                            bool             bHasType   = TryParseCardType(cardElem.GetAttribute("type"), out cardType);

                            if (bHasType && bHasRarity)
                            {
                                TriadCard newCard = new TriadCard(
                                    int.Parse(cardElem.GetAttribute("id")),
                                    WebUtility.HtmlDecode(cardElem.GetAttribute("name")),
                                    cardElem.GetAttribute("icon"),
                                    cardRarity,
                                    cardType,
                                    ParseCardSideNum(cardElem.GetAttribute("up")),
                                    ParseCardSideNum(cardElem.GetAttribute("dn")),
                                    ParseCardSideNum(cardElem.GetAttribute("lt")),
                                    ParseCardSideNum(cardElem.GetAttribute("rt")),
                                    int.Parse(cardElem.GetAttribute("sort")));

                                if (newCard.IsValid())
                                {
                                    loadedCards.Add(newCard);
                                    maxLoadedId = Math.Max(maxLoadedId, newCard.Id);
                                }
                                else
                                {
                                    Logger.WriteLine("Loading failed! ob[" + newCard + "], xml:" + cardElem.OuterXml);
                                }
                            }
                            else
                            {
                                Logger.WriteLine("Loading failed! xml:" + cardElem.OuterXml);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.WriteLine("Loading failed! Exception:" + ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLine("Loading failed! Exception:" + ex);
            }

            if (loadedCards.Count > 0)
            {
                while (cards.Count < (maxLoadedId + 1))
                {
                    cards.Add(null);
                }

                foreach (TriadCard card in loadedCards)
                {
                    cards[card.Id] = card;
                }
            }

            sameNumberMap.Clear();
            int sameNumberId = 0;

            for (int Idx1 = 0; Idx1 < cards.Count; Idx1++)
            {
                TriadCard card1 = cards[Idx1];
                if (card1 != null && card1.SameNumberId < 0)
                {
                    bool bHasSameNumberCards = false;
                    for (int Idx2 = (Idx1 + 1); Idx2 < cards.Count; Idx2++)
                    {
                        TriadCard card2 = cards[Idx2];
                        if (card2 != null && card2.SameNumberId < 0)
                        {
                            bool bHasSameNumbers =
                                (card1.Sides[0] == card2.Sides[0]) &&
                                (card1.Sides[1] == card2.Sides[1]) &&
                                (card1.Sides[2] == card2.Sides[2]) &&
                                (card1.Sides[3] == card2.Sides[3]);

                            bHasSameNumberCards = bHasSameNumberCards || bHasSameNumbers;
                            if (bHasSameNumbers)
                            {
                                if (!sameNumberMap.ContainsKey(sameNumberId))
                                {
                                    sameNumberMap.Add(sameNumberId, new List <TriadCard>());
                                    sameNumberMap[sameNumberId].Add(card1);
                                    card1.SameNumberId = sameNumberId;
                                }

                                sameNumberMap[sameNumberId].Add(card2);
                                card2.SameNumberId = sameNumberId;
                            }
                        }
                    }

                    if (bHasSameNumberCards)
                    {
                        sameNumberId++;
                    }
                }
            }

            Logger.WriteLine("Loaded cards: " + loadedCards.Count + ", same sides: " + sameNumberMap.Count);
            return(loadedCards.Count > 0);
        }
Пример #6
0
        private void ApplyAscentionFilter(List <CardScoreData> commonScoredList, List <List <CardScoreData> > priScoredList)
        {
            Func <CardScoreData, float> FindCardAscValue = scoredEntry => scoredEntry.score;

            int maxCardTypes = Enum.GetValues(typeof(ETriadCardType)).Length;
            int maxLists     = priScoredList.Count + 1;

            List <float>[,] mapCardAscValues = new List <float> [maxCardTypes, maxLists];

            for (int idxL = 0; idxL < priScoredList.Count + 1; idxL++)
            {
                for (int idxT = 0; idxT < maxCardTypes; idxT++)
                {
                    mapCardAscValues[idxT, idxL] = new List <float>();
                }

                if (idxL > 0)
                {
                    foreach (var scoredEntry in priScoredList[idxL - 1])
                    {
                        mapCardAscValues[(int)scoredEntry.card.Type, idxL].Add(FindCardAscValue(scoredEntry));
                    }
                }
            }

            foreach (var scoredEntry in commonScoredList)
            {
                if (scoredEntry.card.Type != ETriadCardType.None)
                {
                    mapCardAscValues[(int)scoredEntry.card.Type, 0].Add(FindCardAscValue(scoredEntry));
                }
            }

            ETriadCardType bestType  = ETriadCardType.None;
            float          bestScore = 0;

            if (debugMode)
            {
                Logger.WriteLine("Ascension filter...");
            }
            for (int idxT = 0; idxT < maxCardTypes; idxT++)
            {
                if (idxT == (int)ETriadCardType.None)
                {
                    continue;
                }

                float[] typePartialScores = new float[maxLists];
                float   typeScore         = 0;
                for (int idxL = 0; idxL < maxLists; idxL++)
                {
                    for (int cardIdx = 0; cardIdx < mapCardAscValues[idxT, idxL].Count; cardIdx++)
                    {
                        typePartialScores[idxL] += mapCardAscValues[idxT, idxL][cardIdx];
                    }

                    if (mapCardAscValues[idxT, idxL].Count == 0)
                    {
                        typePartialScores[idxL] = 0;
                    }
                    else
                    {
                        typePartialScores[idxL] /= mapCardAscValues[idxT, idxL].Count;
                    }

                    typeScore += typePartialScores[idxL];
                }
                typeScore /= maxLists;

                if (debugMode)
                {
                    Logger.WriteLine("  [{0}]: score:{1} ({2})", (ETriadCardType)idxT, typeScore, string.Join(", ", typePartialScores));
                }
                if (bestScore <= 0.0f || typeScore > bestScore)
                {
                    bestScore = typeScore;
                    bestType  = (ETriadCardType)idxT;
                }
            }

            if (bestType != ETriadCardType.None)
            {
                if (debugMode)
                {
                    Logger.WriteLine("  best: {0}", bestType);
                }
                Action <CardScoreData, ETriadCardType> IncreaseScoreForType = (scoredEntry, cardType) =>
                {
                    if (scoredEntry.card.Type == cardType)
                    {
                        scoredEntry.score += 1000.0f;
                    }
                };

                foreach (var scoredEntry in commonScoredList)
                {
                    IncreaseScoreForType(scoredEntry, bestType);
                }

                foreach (var priList in priScoredList)
                {
                    foreach (var scoredEntry in priList)
                    {
                        IncreaseScoreForType(scoredEntry, bestType);
                    }
                }
            }
        }
Пример #7
0
        private Dictionary <int, TriadCard> ParseCards(string folderPath)
        {
            Dictionary <int, ETriadCardType>    typeMap     = ParseCardTypes(folderPath);
            Dictionary <int, string>            nameMap     = ParseCardNames(folderPath);
            Dictionary <string, ETriadCardType> typeNameMap = CreateCardTypeNameMap();

            string patternRarity = "TripleTriadCardRarity#";

            Dictionary <int, TriadCard> loadedCards = new Dictionary <int, TriadCard>();
            List <string[]>             cardData    = ParseCSVFile(folderPath + "TripleTriadCardResident.csv");

            if (cardData.Count > 0 && cardData[0].Length == 10)
            {
                for (int Idx = 0; Idx < cardData.Count; Idx++)
                {
                    int keyIdx = int.Parse(cardData[Idx][0]);

                    int rarityIdx = 0;
                    if (cardData[Idx][6].StartsWith(patternRarity))
                    {
                        rarityIdx = int.Parse(cardData[Idx][6].Substring(patternRarity.Length));
                    }
                    else
                    {
                        rarityIdx = int.Parse(cardData[Idx][6]);
                    }

                    ETriadCardType cardType = ETriadCardType.None;
                    string         typeDef  = cardData[Idx][7];
                    if (typeDef.Length == 1)
                    {
                        int typeDefInt = int.Parse(typeDef);
                        cardType = typeMap[typeDefInt];
                    }
                    else if (typeDef.Length > 0)
                    {
                        cardType = typeNameMap[typeDef];
                    }

                    int    iconId   = 82500 + keyIdx;
                    string iconPath = iconId.ToString("000000") + ".png";

                    int numUp    = int.Parse(cardData[Idx][2]);
                    int numDown  = int.Parse(cardData[Idx][3]);
                    int numRight = int.Parse(cardData[Idx][4]);
                    int numLeft  = int.Parse(cardData[Idx][5]);

                    if (numUp > 0 && numDown > 0 && numRight > 0 && numLeft > 0)
                    {
                        TriadCard cardOb = new TriadCard(0, nameMap[keyIdx], iconPath,
                                                         (ETriadCardRarity)(rarityIdx - 1), cardType,
                                                         numUp, numDown, numLeft, numRight,
                                                         int.Parse(cardData[Idx][9]));

                        if (cardOb.IsValid())
                        {
                            loadedCards.Add(keyIdx, cardOb);
                        }
                    }
                }
            }
            else
            {
                throw new Exception("Unable to parse cards from csv!");
            }

            return(loadedCards);
        }
Пример #8
0
        public bool Load()
        {
            try
            {
                XmlDocument xdoc       = new XmlDocument();
                Stream      dataStream = AssetManager.Get().GetAsset(DBPath);
                xdoc.Load(dataStream);

                foreach (XmlNode cardNode in xdoc.DocumentElement.ChildNodes)
                {
                    XmlElement cardElem = (XmlElement)cardNode;
                    if (cardElem != null && cardElem.Name == "card")
                    {
                        try
                        {
                            ETriadCardRarity cardRarity = (ETriadCardRarity)int.Parse(cardElem.GetAttribute("rarity"));
                            ETriadCardType   cardType   = (ETriadCardType)int.Parse(cardElem.GetAttribute("type"));
                            int sortOrder = int.Parse(cardElem.GetAttribute("sort"));
                            int cardGroup = int.Parse(cardElem.GetAttribute("group"));

                            TriadCard newCard = new TriadCard(
                                int.Parse(cardElem.GetAttribute("id")),
                                cardElem.GetAttribute("icon"),
                                cardRarity,
                                cardType,
                                ParseCardSideNum(cardElem.GetAttribute("up")),
                                ParseCardSideNum(cardElem.GetAttribute("dn")),
                                ParseCardSideNum(cardElem.GetAttribute("lt")),
                                ParseCardSideNum(cardElem.GetAttribute("rt")),
                                sortOrder,
                                cardGroup);

                            while (cards.Count <= newCard.Id)
                            {
                                cards.Add(null);
                            }

                            cards[newCard.Id] = newCard;
                        }
                        catch (Exception ex)
                        {
                            Logger.WriteLine("Loading failed! Exception:" + ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLine("Loading failed! Exception:" + ex);
            }

            sameNumberMap.Clear();
            int sameNumberId = 0;

            for (int Idx1 = 0; Idx1 < cards.Count; Idx1++)
            {
                TriadCard card1 = cards[Idx1];
                if (card1 != null && card1.SameNumberId < 0)
                {
                    bool bHasSameNumberCards = false;
                    for (int Idx2 = (Idx1 + 1); Idx2 < cards.Count; Idx2++)
                    {
                        TriadCard card2 = cards[Idx2];
                        if (card2 != null && card2.SameNumberId < 0)
                        {
                            bool bHasSameNumbers =
                                (card1.Sides[0] == card2.Sides[0]) &&
                                (card1.Sides[1] == card2.Sides[1]) &&
                                (card1.Sides[2] == card2.Sides[2]) &&
                                (card1.Sides[3] == card2.Sides[3]);

                            bHasSameNumberCards = bHasSameNumberCards || bHasSameNumbers;
                            if (bHasSameNumbers)
                            {
                                if (!sameNumberMap.ContainsKey(sameNumberId))
                                {
                                    sameNumberMap.Add(sameNumberId, new List <TriadCard>());
                                    sameNumberMap[sameNumberId].Add(card1);
                                    card1.SameNumberId = sameNumberId;
                                }

                                sameNumberMap[sameNumberId].Add(card2);
                                card2.SameNumberId = sameNumberId;
                            }
                        }
                    }

                    if (bHasSameNumberCards)
                    {
                        sameNumberId++;
                    }
                }
            }

            Logger.WriteLine("Loaded cards: " + cards.Count + ", same sides: " + sameNumberMap.Count);
            return(cards.Count > 0);
        }