/// <summary> /// 艦娘リストをKammusuPatch.csvから取得する(上書き用) /// </summary> /// <returns>艦娘リスト</returns> public List <KeyValuePair <Kammusu, List <int> > > downloadKammusuDataFromLocalFile() { var result = new List <KeyValuePair <Kammusu, List <int> > >(); if (System.IO.File.Exists(@"Resource\KammusuPatch.csv")) { using (var sr = new System.IO.StreamReader(@"Resource\KammusuPatch.csv")) { while (!sr.EndOfStream) { // 1行読み込み、カンマ毎に区切る string line = sr.ReadLine(); string[] values = line.Split(','); // 行数がおかしい場合は飛ばす if (values.Count() < 16) { continue; } // ヘッダー行は飛ばす if (values[0] == "id") { continue; } // データを読み取る int id = int.Parse(values[0]); string name = values[1]; var type = KammusuTypeReverseDic.ContainsKey(values[2]) ? KammusuTypeReverseDic[values[2]] : KammusuType.Other; int antiAir = int.Parse(values[3]); int slotSize = int.Parse(values[4]); bool kammusuFlg = int.Parse(values[15]) == 1; var kammusu = new Kammusu(id, name, type, antiAir, new List <int>(), kammusuFlg); var defaultWeaponList = new List <int>(); for (int i = 0; i < slotSize; ++i) { int slot = int.Parse(values[5 + i]); int defaultWeapon = int.Parse(values[10 + i]); kammusu.SlotList.Add(slot); defaultWeaponList.Add(defaultWeapon); } result.Add(new KeyValuePair <Kammusu, List <int> >(kammusu, defaultWeaponList)); } } } return(result); }
/// <summary> /// 艦娘リストをデッキビルダーからダウンロードする /// (性質上、詳細な情報を取得できない敵艦もある) /// </summary> /// <returns>艦娘リスト</returns> public async Task <List <KeyValuePair <Kammusu, List <int> > > > downloadKammusuDataFromDeckBuilderAsync() { var result = new List <KeyValuePair <Kammusu, List <int> > >(); using (var client = new HttpClient()) { // テキストデータをダウンロード string rawData = await client.GetStringAsync("http://kancolle-calc.net/data/shipdata.js"); // 余計な文字を削除 rawData = rawData.Replace("var gShips = ", ""); // JSONとしてパース var obj = DynamicJson.Parse(rawData); // パース結果を取得 foreach (var kammusu in obj) { // 艦船IDや艦名などを取得 int id = int.Parse(kammusu.id); if (id > 1900) { continue; } string name = (string)kammusu.name; if (name == "なし") { continue; } int antiAir = (int)kammusu.max_aac; int slotCount = (int)kammusu.slot; var slot = kammusu.carry; var defaultWeapon = kammusu.equip; // 艦娘か? bool kammusuFlg = id <= 1500; // 艦種データを変換する string rawType = (string)kammusu.type; var type = KammusuTypeReverseDic.ContainsKey(rawType) ? KammusuTypeReverseDic[rawType] : KammusuType.Other; //深海棲艦における「航空戦艦」には陸上型も混じっているので個別に対策する if (!kammusuFlg && AFSet.Contains(name)) { type = KammusuType.AF; } // Kammusuクラスとしてまとめる var kammusuData = new Kammusu(id, name, type, antiAir, new List <int>(), kammusuFlg); var defaultWeaponData = new List <int>(); foreach (var s in slot) { kammusuData.SlotList.Add((int)s); } foreach (var w in defaultWeapon) { defaultWeaponData.Add((int)w); } int temp = defaultWeaponData.Count; for (int i = temp; i < slotCount; ++i) { defaultWeaponData.Add(0); } // データの整合性がおかしいものは追記しない if (kammusuData.SlotList.Count != slotCount) { Console.WriteLine($"不完全データを検知→ id:{id} name:{name}"); continue; } // 追記する result.Add(new KeyValuePair <Kammusu, List <int> >(kammusuData, defaultWeaponData)); } } return(result); }