private void _record(OsianLogic logic, SortedDictionary <string, RecordData> put, bool attackFrame = false) { var left = logic.Players[0]; var data = logic.Map; for (int i = 0; i < OsianLogic.LEN_X; i++) { for (int j = 0; j < OsianLogic.LEN_Y; j++) { if (data.Map[i, j] is BarrackMapObject b) { put.Add("a" + i + "," + j, RecordData.Make(i, j, 1, b.Owner == left ? 0 : 1, "team" + (b.Owner == left ? "l" : (b.Owner == null ? "n" : "r")), "")); } if (data.Map[i, j] is ObstacleMapObject ob) { put.Add("a" + i + "," + j, RecordData.Make(i, j, 1, ob.Owner == left ? 0 : 1, "obstacle", "")); } } } Dictionary <string, string> dup = new Dictionary <string, string> (); foreach (var army in data.Army) { var keystr = _armyStr(army, ""); keystr = ((int)('e' - keystr[0])) + keystr; var key = "m" + army.Timestamp + "." + keystr; var dupkey = keystr + army.PosX + "," + army.PosY; if (dup.ContainsKey(dupkey)) { var v = put[dup[dupkey]]; v.c = "x" + (int.Parse(v.c.Substring(1)) + 1); put[dup[dupkey]] = v; } else { var atk = attackFrame; var rd = RecordData.Make(army.PosX, army.PosY - (atk ? 0.02f : 0.0f), 1, army.Owner == left ? 0 : 1, _armyStr(army, atk ? "a" : ""), "x1"); put.Add(key, rd); dup.Add(dupkey, key); } } }