コード例 #1
0
        private void TextSearch()
        {
            string searchTerm = boxSearch.Text.Trim().ToLower();

            if (searchTerm == "")
            {
                return;                   //don't search blank
            }
            int pos = DisplayedString_ListBox.SelectedIndex;

            pos += 1; //search this and 1 forward
            for (int i = 0; i < CleanedStrings.Count; i++)
            {
                int          curIndex = (i + pos) % CleanedStrings.Count;
                TLKStringRef node     = CleanedStrings[curIndex];

                if (CleanedStrings[curIndex].StringID.ToString().Contains(searchTerm))
                {
                    //ID Search
                    DisplayedString_ListBox.SelectedIndex = curIndex;
                    return;
                }
                else if (CleanedStrings[curIndex].Data != null && CleanedStrings[curIndex].Data.ToLower().Contains(searchTerm))
                {
                    DisplayedString_ListBox.SelectedIndex = curIndex;
                    DisplayedString_ListBox.ScrollIntoView(DisplayedString_ListBox.SelectedItem);
                    return;
                }
            }
            //Not found
            SystemSounds.Beep.Play();
        }
コード例 #2
0
        private void Evt_AddString(object sender, RoutedEventArgs e)
        {
            var blankstringref = new TLKStringRef(100, 1, "New Blank Line");

            LoadedStrings.Add(blankstringref);
            CleanedStrings.Add(blankstringref);
            DisplayedString_ListBox.SelectedIndex = CleanedStrings.Count() - 1;           //Set focus to new line (which is the last one)
            DisplayedString_ListBox.ScrollIntoView(DisplayedString_ListBox.SelectedItem); //Scroll to last item
            SetNewID();
            FileModified = true;
        }
コード例 #3
0
ファイル: TalkFile.cs プロジェクト: aquadran/ME3Explorer
        /// <summary>
        /// Loads a TLK file into memory.
        /// </summary>
        /// <param name="fileName"></param>
        public void LoadTlkData(string fileName)
        {
            path = fileName;
            name = Path.GetFileNameWithoutExtension(fileName);

            /* **************** STEP ONE ****************
             *          -- load TLK file header --
             *
             * reading first 28 (4 * 7) bytes
             */

            Stream       fs = File.OpenRead(fileName);
            BinaryReader r  = new BinaryReader(fs);

            Header = new TLKHeader(r);

            //DebugTools.PrintHeader(Header);

            /* **************** STEP TWO ****************
             *  -- read and store Huffman Tree nodes --
             */
            /* jumping to the beginning of Huffmann Tree stored in TLK file */
            long pos = r.BaseStream.Position;

            r.BaseStream.Seek(pos + (Header.MaleEntryCount + Header.FemaleEntryCount) * 8, SeekOrigin.Begin);

            CharacterTree = new List <HuffmanNode>();
            for (int i = 0; i < Header.treeNodeCount; i++)
            {
                CharacterTree.Add(new HuffmanNode(r));
            }

            /* **************** STEP THREE ****************
             *  -- read all of coded data into memory --
             */
            byte[] data = new byte[Header.dataLen];
            r.BaseStream.Read(data, 0, data.Length);
            /* and store it as raw bits for further processing */
            Bits = new BitArray(data);

            /* rewind BinaryReader just after the Header
             * at the beginning of TLK Entries data */
            r.BaseStream.Seek(pos, SeekOrigin.Begin);

            /* **************** STEP FOUR ****************
             * -- decode (basing on Huffman Tree) raw bits data into actual strings --
             * and store them in a Dictionary<int, string> where:
             *   int: bit offset of the beginning of data (offset starting at 0 and counted for Bits array)
             *        so offset == 0 means the first bit in Bits array
             *   string: actual decoded string */
            Dictionary <int, string> rawStrings = new Dictionary <int, string>();
            int offset = 0;

            // int maxOffset = 0;
            while (offset < Bits.Length)
            {
                int key = offset;
                // if (key > maxOffset)
                // maxOffset = key;
                /* read the string and update 'offset' variable to store NEXT string offset */
                string s = GetString(ref offset);
                rawStrings.Add(key, s);
            }

            // Console.WriteLine("Max offset = " + maxOffset);

            /* **************** STEP FIVE ****************
             *         -- bind data to String IDs --
             * go through Entries in TLK file and read it's String ID and offset
             * then check if offset is a key in rawStrings and if it is, then bind data.
             * Sometimes there's no such key, in that case, our String ID is probably a substring
             * of another String present in rawStrings.
             */
            StringRefs = new List <TLKStringRef>();
            for (int i = 0; i < Header.MaleEntryCount + Header.FemaleEntryCount; i++)
            {
                TLKStringRef sref = new TLKStringRef(r);
                sref.position = i;
                if (sref.BitOffset >= 0)
                {
                    if (!rawStrings.ContainsKey(sref.BitOffset))
                    {
                        int    tmpOffset  = sref.BitOffset;
                        string partString = GetString(ref tmpOffset);

                        /* actually, it should store the fullString and subStringOffset,
                         * but as we don't have to use this compression feature,
                         * we will store only the part of string we need */

                        /* int key = rawStrings.Keys.Last(c => c < sref.BitOffset);
                         * string fullString = rawStrings[key];
                         * int subStringOffset = fullString.LastIndexOf(partString);
                         * sref.StartOfString = subStringOffset;
                         * sref.Data = fullString;
                         */
                        sref.Data = partString;
                    }
                    else
                    {
                        sref.Data = rawStrings[sref.BitOffset];
                    }
                }
                StringRefs.Add(sref);
            }
            r.Close();
        }
コード例 #4
0
ファイル: TalkFile.cs プロジェクト: aquadran/ME3Explorer
        /* for sorting */
        private static int CompareTlkStringRef(TLKStringRef strRef1, TLKStringRef strRef2)
        {
            int result = strRef1.StringID.CompareTo(strRef2.StringID);

            return(result);
        }
コード例 #5
0
ファイル: TalkFile.cs プロジェクト: ME3Explorer/ME3Explorer
        /// <summary>
        /// Loads a TLK file into memory.
        /// </summary>
        /// <param name="fileName"></param>
        public void LoadTlkData(string fileName)
        {
            path = fileName;
            name = Path.GetFileNameWithoutExtension(fileName);
            /* **************** STEP ONE ****************
             *          -- load TLK file header --
             * 
             * reading first 28 (4 * 7) bytes 
             */
            
            Stream fs = File.OpenRead(fileName);
            BinaryReader r = new BinaryReader(fs);
            Header = new TLKHeader(r);

            //DebugTools.PrintHeader(Header);

            /* **************** STEP TWO ****************
             *  -- read and store Huffman Tree nodes -- 
             */
            /* jumping to the beginning of Huffmann Tree stored in TLK file */
            long pos = r.BaseStream.Position;
            r.BaseStream.Seek(pos + (Header.MaleEntryCount + Header.FemaleEntryCount) * 8, SeekOrigin.Begin);

            CharacterTree = new List<HuffmanNode>();
            for (int i = 0; i < Header.treeNodeCount; i++)
                CharacterTree.Add(new HuffmanNode(r));

            /* **************** STEP THREE ****************
             *  -- read all of coded data into memory -- 
             */
            byte[] data = new byte[Header.dataLen];
            r.BaseStream.Read(data, 0, data.Length);
            /* and store it as raw bits for further processing */
            Bits = new BitArray(data);

            /* rewind BinaryReader just after the Header
             * at the beginning of TLK Entries data */
            r.BaseStream.Seek(pos, SeekOrigin.Begin);

            /* **************** STEP FOUR ****************
             * -- decode (basing on Huffman Tree) raw bits data into actual strings --
             * and store them in a Dictionary<int, string> where:
             *   int: bit offset of the beginning of data (offset starting at 0 and counted for Bits array)
             *        so offset == 0 means the first bit in Bits array
             *   string: actual decoded string */
            Dictionary<int, string> rawStrings = new Dictionary<int, string>();
            int offset = 0;
            // int maxOffset = 0;
            while (offset < Bits.Length)
            {
                int key = offset;
                // if (key > maxOffset)
                    // maxOffset = key;
                /* read the string and update 'offset' variable to store NEXT string offset */
                string s = GetString(ref offset);
                rawStrings.Add(key, s);
            }
            
            // Console.WriteLine("Max offset = " + maxOffset);

            /* **************** STEP FIVE ****************
             *         -- bind data to String IDs --
             * go through Entries in TLK file and read it's String ID and offset
             * then check if offset is a key in rawStrings and if it is, then bind data.
             * Sometimes there's no such key, in that case, our String ID is probably a substring
             * of another String present in rawStrings. 
             */
            StringRefs = new List<TLKStringRef>();
            for (int i = 0; i < Header.MaleEntryCount + Header.FemaleEntryCount; i++)
            {
                TLKStringRef sref = new TLKStringRef(r);
                sref.position = i;
                if (sref.BitOffset >= 0)
                {
                    if (!rawStrings.ContainsKey(sref.BitOffset))
                    {
                        int tmpOffset = sref.BitOffset;
                        string partString = GetString(ref tmpOffset);

                        /* actually, it should store the fullString and subStringOffset,
                         * but as we don't have to use this compression feature,
                         * we will store only the part of string we need */

                        /* int key = rawStrings.Keys.Last(c => c < sref.BitOffset);
                         * string fullString = rawStrings[key];
                         * int subStringOffset = fullString.LastIndexOf(partString);
                         * sref.StartOfString = subStringOffset;
                         * sref.Data = fullString;
                         */
                        sref.Data = partString;
                    }
                    else
                    {
                        sref.Data = rawStrings[sref.BitOffset];
                    }
                }
                StringRefs.Add(sref);
            }
            r.Close();
        }
コード例 #6
0
ファイル: TalkFile.cs プロジェクト: ME3Explorer/ME3Explorer
 /* for sorting */
 private static int CompareTlkStringRef(TLKStringRef strRef1, TLKStringRef strRef2)
 {
     int result = strRef1.StringID.CompareTo(strRef2.StringID);
     return result;
 }
コード例 #7
0
ファイル: TalkFile.cs プロジェクト: solarisstar/ME3Explorer
        public void LoadTlkData()
        {
            BinaryReader r = new BinaryReader(new MemoryStream(pcc.Exports[index].Data), Encoding.Unicode);

            //skip properties
            r.BaseStream.Seek(40, SeekOrigin.Begin);

            //hashtable
            int entryCount = r.ReadInt32();

            StringRefs = new TLKStringRef[entryCount];
            for (int i = 0; i < entryCount; i++)
            {
                StringRefs[i] = new TLKStringRef(r);
            }

            //Huffman tree
            nodes = new List <HuffmanNode>();
            int  nodeCount = r.ReadInt32();
            bool leaf;

            for (int i = 0; i < nodeCount; i++)
            {
                leaf = r.ReadBoolean();
                if (leaf)
                {
                    nodes.Add(new HuffmanNode(r.ReadChar()));
                }
                else
                {
                    nodes.Add(new HuffmanNode(r.ReadInt16(), r.ReadInt16()));
                }
            }
            //TraverseHuffmanTree(nodes[0], new List<bool>());

            //encoded data
            int stringCount = r.ReadInt32();

            byte[] data = new byte[r.BaseStream.Length - r.BaseStream.Position];
            r.Read(data, 0, data.Length);
            Bits = new BitArray(data);

            //decompress encoded data with huffman tree
            int           offset = 4;
            int           size;
            List <string> rawStrings = new List <string>(stringCount);

            while (offset * 8 < Bits.Length)
            {
                size    = BitConverter.ToInt32(data, offset);
                offset += 4;
                string s = GetString(offset * 8);
                offset += size + 4;
                rawStrings.Add(s);
            }

            //associate StringIDs with strings
            for (int i = 0; i < StringRefs.Length; i++)
            {
                if (StringRefs[i].Flags[0] == 1)
                {
                    StringRefs[i].Data = rawStrings[StringRefs[i].Index];
                }
            }
        }