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; }
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); }