public ImagePatternDigit LoadDigitEntry(XmlElement xmlElem) { ImagePatternDigit result = new ImagePatternDigit(-1, null); if (xmlElem != null && xmlElem.Name == "digit" && xmlElem.HasAttribute("type") && xmlElem.HasAttribute("value")) { string typeName = xmlElem.GetAttribute("type"); string hashValue = xmlElem.GetAttribute("value"); result = new ImagePatternDigit(int.Parse(typeName), ImageDataDigit.FromHexString(hashValue)); } return(result); }
public void AddKnownDigit(ImagePatternDigit digitData) { for (int Idx = 0; Idx < customDigits.Count; Idx++) { if (customDigits[Idx].Hash == digitData.Hash) { customDigits[Idx] = digitData; return; } } customDigits.Add(digitData); MarkDirty(); }
public List <ImagePatternDigit> LoadDigitHashes(JsonParser.ArrayValue jsonArr) { List <ImagePatternDigit> list = new List <ImagePatternDigit>(); foreach (JsonParser.Value value in jsonArr.entries) { JsonParser.ObjectValue jsonOb = (JsonParser.ObjectValue)value; string hashValue = (JsonParser.StringValue)jsonOb["hash"]; ImagePatternDigit digitHash = new ImagePatternDigit((JsonParser.IntValue)jsonOb["id"], ImageDataDigit.FromHexString(hashValue)); list.Add(digitHash); } return(list); }
public static float HasPatternMatch(byte[] cachedMatchData, int posX, int posY, int cacheWidth, bool bExact, ImagePatternDigit patternMask, bool bDebugMode = false) { const int patternWidth = 10; int NumMatching = 0; int NumTotal = 0; for (int IdxY = 0; IdxY < 8; IdxY++) { string debugDesc = ""; int ByteIdx = ((posY + IdxY) * cacheWidth) + posX; for (int IdxX = 0; IdxX < patternWidth; IdxX++) { bool bHasMatch = cachedMatchData[ByteIdx] == 1; bool bWantsMatch = (patternMask.PixelMask[IdxX] & (1 << IdxY)) != 0; if (bExact) { NumMatching += (bHasMatch == bWantsMatch) ? (bHasMatch ? 2 : 1) : 0; } else { NumMatching += (bHasMatch && bWantsMatch) ? 1 : 0; } NumTotal += bWantsMatch ? 1 : 0; ByteIdx++; if (bDebugMode) { debugDesc += (bHasMatch ? (bWantsMatch ? "#" : "x") : (bWantsMatch ? "?" : ".")) + " "; } } if (bDebugMode) { Logger.WriteLine(debugDesc); } } float MatchPct = (float)NumMatching / (bExact ? ((80 - NumTotal) + (NumTotal * 2)) : NumTotal); if (bDebugMode) { Logger.WriteLine("HasPatternMatch: " + patternMask.Value + " at (" + posX + ", " + posY + ") = " + (int)(100 * MatchPct) + "%"); } return(MatchPct); }
public bool LoadFromXmlStream(Stream stream) { TriadCardDB cardDB = TriadCardDB.Get(); TriadNpcDB npcDB = TriadNpcDB.Get(); try { XmlDocument xdoc = new XmlDocument(); xdoc.Load(stream); foreach (XmlNode testNode in xdoc.DocumentElement.ChildNodes) { try { XmlElement testElem = (XmlElement)testNode; if (testElem != null && testElem.Name == "ui") { int autoScanNum = int.Parse(testElem.GetAttribute("autoScan")); useAutoScan = (autoScanNum == 1); } else if (testElem != null && testElem.Name == "cloud") { int useNum = int.Parse(testElem.GetAttribute("use")); useCloudStorage = (useNum == 1); cloudToken = testElem.HasAttribute("token") ? testElem.GetAttribute("token") : null; } else if (testElem != null && testElem.Name == "card") { int cardId = int.Parse(testElem.GetAttribute("id")); ownedCards.Add(cardDB.cards[cardId]); } else if (testElem != null && testElem.Name == "npc") { int npcId = int.Parse(testElem.GetAttribute("id")); completedNpcs.Add(npcDB.npcs[npcId]); } else if (testElem != null && testElem.Name == "deck") { int npcId = int.Parse(testElem.GetAttribute("id")); TriadNpc npc = TriadNpcDB.Get().npcs[npcId]; if (npc != null) { TriadDeck deckCards = new TriadDeck(); foreach (XmlAttribute attr in testElem.Attributes) { if (attr.Name.StartsWith("card")) { string cardNumStr = attr.Name.Substring(4); int cardNum = int.Parse(cardNumStr); while (deckCards.knownCards.Count < (cardNum + 1)) { deckCards.knownCards.Add(null); } int cardId = int.Parse(attr.Value); deckCards.knownCards[cardNum] = TriadCardDB.Get().cards[cardId]; } } lastDeck.Add(npc, deckCards); } } else { ImageHashData customHash = ImageHashDB.Get().LoadHashEntry(testElem); if (customHash != null) { customHashes.Add(customHash); } else { ImagePatternDigit customDigit = ImageHashDB.Get().LoadDigitEntry(testElem); if (customDigit.Value > 0) { customDigits.Add(customDigit); } } } } catch (Exception ex) { Logger.WriteLine("Loading failed! Exception:" + ex); } } } catch (Exception ex) { Logger.WriteLine("Loading failed! Exception:" + ex); } return(ownedCards.Count > 0); }