Пример #1
0
        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);
        }
Пример #2
0
        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();
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }