예제 #1
0
    private void PostReadProc()
    {
        //--- check reading was success or not
        if (read_mode != ReadMode.Body)
        {
            return;
        }

        //--- store Base64 ext data
        var sb = new StringBuilder();

        for (int i = _b64_start; i <= _b64_end; i++)
        {
            sb.Append(line_list[i]);
        }
        byte[] b64_decoded_bytes = Convert.FromBase64String(sb.ToString());

        int index_len = b64_decoded_bytes.Length / 4;

        if (b64_decoded_bytes.Length % 4 != 0)
        {
            read_mode = ReadMode.Base64DataError;
            return;
        }
        int[] IndexSeq = new int[b64_decoded_bytes.Length / 4];
        for (int i = 0; i < b64_decoded_bytes.Length / 4; i++)
        {
            IndexSeq[i] = BitConverter.ToInt32(b64_decoded_bytes, i * 4);
        }

        //--- check Base64 ext data
        if (IndexSeq.Length != Data.Count)
        {
            read_mode = ReadMode.PostProcError;

            //    var sb = new System.Text.StringBuilder();
            //    sb.Append("ERROR in PostReadProc().\n");
            //    sb.Append($"IndexSeq.Length = {IndexSeq.Length}\n");
            //    sb.Append($"Data.Length     = {Data.Length}\n");
            //    UnityEngine.Debug.LogError(sb.ToString());

            return;
        }
        for (int i = 0; i < IndexSeq.Length; i++)
        {
            if (IndexSeq[i] != Data[i].ID)
            {
                read_mode = ReadMode.PostProcError;

                //    var sb = new System.Text.StringBuilder();
                //    sb.Append("ERROR in PostReadProc().\n");
                //    for(int j=0; j<IndexSeq.Length; j++)
                //    {
                //        sb.Append($"  Elems[{j}]: [IndexSeq[i] / Data[i].ID] = [{IndexSeq[j]} / {Data[j].ID}]");
                //        if (IndexSeq[j] != Data[j].ID) sb.Append(" -- differ.");
                //        sb.Append('\n');
                //    }
                //    UnityEngine.Debug.LogError(sb.ToString());

                return;
            }
        }

        read_mode = ReadMode.Complete;
        return;
    }
예제 #2
0
    private bool ParseLine(string line)
    {
        const string mark_comment = "#";

        const string mark_tag     = "<@MARK>";
        const string mark_header  = "Header";
        const string mark_ext     = "ExtData";
        const string mark_ext_end = "ExtDataEnd";
        const string mark_body    = "Body";

        const string mark_n_total = "n_total";
        const string mark_d       = "d";
        const string mark_r       = "r";

        Lines++;
        if (line.Length < 1)
        {
            return(true);
        }

        var str_list = line.Split('\t');

        //--- check data block
        if (str_list.Length >= 2 && str_list[0] == mark_tag)
        {
            if (str_list[1] == mark_header)
            {
                read_mode = ReadMode.Header;
            }
            else if (str_list[1] == mark_ext)
            {
                read_mode = ReadMode.ExtData;
            }
            else if (str_list[1] == mark_ext_end)
            {
                read_mode = ReadMode.None;
            }
            else if (str_list[1] == mark_body)
            {
                //--- check header info was read correctly or not
                if (N <= 0 || D <= 0 || R < 0.0 || R >= 1.0)
                {
                    read_mode = ReadMode.HeaderError;
                    return(false);
                }
                read_mode = ReadMode.Body;
            }
            return(true);
        }
        if (read_mode == ReadMode.None)
        {
            return(true);
        }

        //--- ignore comment line
        if (str_list[0].Length >= 1 && str_list[0].Substring(0, 1) == mark_comment)
        {
            return(true);
        }

        //--- store data
        if (read_mode == ReadMode.Header)
        {
            bool success = true;
            // using normal TryParse()
            if (str_list[0] == mark_n_total)
            {
                success = int.TryParse(str_list[1], out N);
            }
            else if (str_list[0] == mark_d)
            {
                success = int.TryParse(str_list[1], out D);
            }
            else if (str_list[0] == mark_r)
            {
                success = float.TryParse(str_list[1], out R);
            }

            if (!success)
            {
                read_mode = ReadMode.HeaderError;
                return(false);
            }
        }
        else if (read_mode == ReadMode.ExtData)
        {
            // recode region of ExtData end decode in PostReadProc
            if (_b64_start < 0)
            {
                _b64_start = Lines - 1;                  // Lines incremented at first in ParseLine().
            }
            _b64_end = Lines - 1;

            return(true);
        }
        else if (read_mode == ReadMode.Body)
        {
            if (str_list.Length < 6)
            {
                return(true);
            }

            var  tmp     = new CharaData_Standard();
            bool success = true;
            success = success && long.TryParse(str_list[0], out tmp.ID);
            success = success && int.TryParse(str_list[2], out tmp.HP);
            success = success && int.TryParse(str_list[3], out tmp.MP);
            success = success && float.TryParse(str_list[4], out tmp.Attack);
            success = success && float.TryParse(str_list[5], out tmp.Defence);

            if (!success)
            {
                read_mode = ReadMode.FormatError;
                return(false);
            }

            tmp.Name = str_list[1];

            Data.Add(tmp);

            if (Data.Count > N)
            {
                read_mode = ReadMode.FormatError;
                return(false);
            }
        }

        return(true);
    }