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; }
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); }
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; } }
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; } }
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); }
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); } } } }
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); }
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); }