public override object[] GetStructures()
        {
            object[] Res = new object[cTotalStructCount];

            int SizeOfItem = Marshal.SizeOf(typeof(MuDef.MUFile_QuestWordHead));
            MuDef.MUFile_QuestWordHead CurrentItem;

            m_FileBuffer = new byte[SizeOfItem * cTotalStructCount];
            byte[] word_buffer = new byte[1024];
            MuDef.MUFile_QuestWord_NoMarshal NoMarshalItem = new MuDef.MUFile_QuestWord_NoMarshal();
            try
            {
               
              //  m_CurrentLine = 1;
                
                while((m_FileStream.Read(m_FileBuffer, 0, SizeOfItem) == SizeOfItem))
                {
                    object Item = Marshal.PtrToStructure(
                        Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, 0),
                        typeof(MuDef.MUFile_QuestWordHead));
                    XorFilter(ref Item);

                    CurrentItem = (MuDef.MUFile_QuestWordHead)Item;
                    //read word

                    m_FileStream.Read(word_buffer,  0, CurrentItem.Length);

                    XorFilter(ref word_buffer, CurrentItem.Length);


                    NoMarshalItem.ID = CurrentItem.ID;
                    //skip null terminator
                    NoMarshalItem.Word = ASCIIEncoding.ASCII.GetString(word_buffer, 0, CurrentItem.Length - 1);
                    Res[m_CurrentLine++] = (object)NoMarshalItem;

                }


            }
            //todo: prevent
            catch (IndexOutOfRangeException)
            {

            }
            catch (Exception)
            {
                MessageBox.Show("Failed to read file structures.");
            }

            CloseSourceFile();
            return Res;
        }
        public override void SaveAsBmd(string OutputPath, DataGridView dgv)
        {
            try
            {
                //last row is null
                int FilledRowCount = dgv.Rows.Count - 1;
                FileStream OutputStream = File.Open(OutputPath, FileMode.Create, FileAccess.Write);


                MuDef.MUFile_QuestWordHead TmpHeader = new MuDef.MUFile_QuestWordHead();
                MuDef.MUFile_QuestWord_NoMarshal TmpNoMarshal = new MuDef.MUFile_QuestWord_NoMarshal();

                for (int i = 0; i < FilledRowCount; i++)
                {
                    TmpNoMarshal.ID = int.Parse(dgv.Rows[i].Cells[0].Value.ToString());
                    TmpNoMarshal.Word = dgv.Rows[i].Cells[1].Value.ToString() + "\0";

                    //make unnative native
                    TmpHeader.ID = TmpNoMarshal.ID;
                    TmpHeader.Length = (ushort)TmpNoMarshal.Word.Length;


                    //header
                    byte[] header_bytes = StructureToByteArray(TmpHeader);
                    XorFilter(ref header_bytes, header_bytes.Length);
                    byte[] text = ASCIIEncoding.ASCII.GetBytes(TmpNoMarshal.Word);
                    XorFilter(ref text, text.Length);

                    OutputStream.Write(header_bytes, 0, header_bytes.Length);
                    OutputStream.Write(text, 0, text.Length);

                }


               // OutputStream.Write(FileBuffer, 0, TotalSize);

                OutputStream.Flush();
                OutputStream.Close();
            }
            catch { MessageBox.Show("Failed to save file"); }
        }