/// <summary> /// 艦娘情報を艦娘フラグで絞り込んで返す /// </summary> /// <param name="kammusuFlg">艦娘フラグ</param> /// <param name="setDefaultWeaponFlg">初期装備を持たせる場合はtrue</param> /// <returns>艦娘リスト。未ヒットの場合は空配列</returns> public List <Kammusu> FindByKammusuFlg(bool kammusuFlg, bool setDefaultWeaponFlg) { // SELECT文を実行する var queryResult = ExecuteReader($"SELECT * FROM kammusu WHERE kammusu_flg={(kammusuFlg ? 1 : 0)}"); if (queryResult.Count == 0) { return(new List <Kammusu>()); } // SELECT文から結果を取得する var result = new List <Kammusu>(); foreach (var qr in queryResult) { int slotSize = (int)qr["slotsize"]; var slotList = new List <int>(); var weaponList = new List <int>(); for (int i = 0; i < slotSize; ++i) { slotList.Add((int)qr[$"slot{i + 1}"]); weaponList.Add((int)qr[$"weapon{i + 1}"]); } var temp = new Kammusu( (int)qr["id"], (string)qr["name"], (KammusuType)qr["type"], (int)qr["antiair"], slotList, qr["kammusu_flg"] == 1); // 初期装備を持たせる if (setDefaultWeaponFlg) { for (int i = 0; i < slotSize; ++i) { temp.WeaponList[i] = FindByWeaponId(weaponList[i]); } } result.Add(temp); } return(result); }
/// <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> /// 艦娘情報を艦船IDから検索して返す /// </summary> /// <param name="id">艦船ID</param> /// <param name="setDefaultWeaponFlg">初期装備を持たせる場合はtrue</param> /// <returns>艦娘情報。未ヒットの場合はnull</returns> public Kammusu FindByKammusuId(int id, bool setDefaultWeaponFlg) { // SELECT文を実行する var queryResult = ExecuteReader($"SELECT * FROM kammusu WHERE id={id}"); if (queryResult.Count == 0) { return(null); } // SELECT文から結果を取得する var queryResult2 = queryResult[0]; int slotSize = (int)queryResult2["slotsize"]; var slotList = new List <int>(); var weaponList = new List <int>(); for (int i = 0; i < slotSize; ++i) { slotList.Add((int)queryResult2[$"slot{i + 1}"]); weaponList.Add((int)queryResult2[$"weapon{i + 1}"]); } var result = new Kammusu( (int)queryResult2["id"], (string)queryResult2["name"], (KammusuType)queryResult2["type"], (int)queryResult2["antiair"], slotList, queryResult2["kammusu_flg"] == 1); // 初期装備を持たせる if (setDefaultWeaponFlg) { for (int i = 0; i < slotSize; ++i) { result.WeaponList[i] = FindByWeaponId(weaponList[i]); } } return(result); }
/// <summary> /// Kammusu型をKammusuData型に変換する /// </summary> /// <param name="kammusu">Kammusu型</param> /// <returns>KammusuData型</returns> private static KammusuData Convert(Kammusu kammusu) { // nullならば、デフォルト値を返す if (kammusu == null) { var kd = new KammusuData { Id = 0, Name = "なし", Type = "その他", Level = 0, AntiAir = 0, SlotSize = 0, KammusuFlg = true, Weapon = new List <WeaponData>(), Slot = new List <int>(), }; } // Type部分を変換 string type = KammusuTypeDic.ContainsKey(kammusu.Type) ? KammusuTypeDic[kammusu.Type] : ""; // 変換後の結果を算出して返す var kammusuData = new KammusuData { Id = kammusu.Id, Name = kammusu.Name, Type = type, Level = 1, AntiAir = kammusu.AntiAir, SlotSize = kammusu.SlotList.Count, KammusuFlg = kammusu.KammusuFlg, Weapon = new List <WeaponData>(), Slot = kammusu.SlotList, }; foreach (var weapon in kammusu.WeaponList) { kammusuData.Weapon.Add(Convert(weapon)); } return(kammusuData); }
/// <summary> /// 艦娘情報を挿入・上書きする /// </summary> /// <param name="kammusu">艦娘情報</param> /// <param name="defaultWeaponIdList">初期装備</param> /// <param name="forceFlg">既存データがある場合上書きしないならfalse</param> private void Save(Kammusu kammusu, List <int> defaultWeaponIdList, bool forceFlg) { if (!forceFlg) { var temp = ExecuteReader($"SELECT count(id) AS count FROM kammusu WHERE id={kammusu.Id}"); if (temp.Count > 0 && temp[0]["count"] >= 1) { return; } } // クエリを作成する string query = string.Format("REPLACE INTO kammusu VALUES ({0},'{1}',{2},{3},{4}", kammusu.Id, kammusu.Name, (int)kammusu.Type, kammusu.AntiAir, kammusu.SlotList.Count); for (int i = 0; i < kammusu.SlotList.Count; ++i) { query += $",{kammusu.SlotList[i]}"; } for (int i = kammusu.SlotList.Count; i < MAX_SLOT_COUNT; ++i) { query += ",0"; } for (int i = 0; i < kammusu.SlotList.Count; ++i) { query += $",{defaultWeaponIdList[i]}"; } for (int i = kammusu.SlotList.Count; i < MAX_SLOT_COUNT; ++i) { query += ",0"; } query += $",{(kammusu.KammusuFlg ? 1 : 0)});"; // クエリを実行する ExecuteNonQuery(query); return; }
/// <summary> /// 艦娘リストをWikiaからダウンロードする /// </summary> /// <returns>艦娘リスト</returns> public async Task <List <KeyValuePair <Kammusu, List <int> > > > downloadKammusuDataFromWikiaAsync() { var result = new List <KeyValuePair <Kammusu, List <int> > >(); // 装備URL→装備番号のリストを取得する var weaponUtlToId = new Dictionary <string, int>(); using (var client = new HttpClient()) { // テキストデータをダウンロード string rawData = await client.GetStringAsync("http://kancolle.wikia.com/wiki/List_of_equipment_used_by_the_enemy"); // テキストデータをパース var doc = default(IHtmlDocument); var parser = new HtmlParser(); doc = parser.Parse(rawData); var tempSelect = doc.QuerySelectorAll("table.wikitable > tbody > tr"); foreach (var record in tempSelect) { var tdList = record.GetElementsByTagName("td").ToList(); if (tdList.Count < 6) { continue; } string rawId = tdList[0].TextContent; string rawName = tdList[2].GetElementsByTagName("a").First().GetAttribute("href"); weaponUtlToId[rawName] = int.Parse(rawId); } } // 深海棲艦のリストを取得し、記録する using (var client = new HttpClient()) { // テキストデータをダウンロード string rawData = await client.GetStringAsync("http://kancolle.wikia.com/wiki/Enemy_Vessels/Full"); // テキストデータをパース var doc = default(IHtmlDocument); var parser = new HtmlParser(); doc = parser.Parse(rawData); var tempSelect = doc.QuerySelectorAll("div > table > tbody > tr"); foreach (var record in tempSelect) { var tdList = record.GetElementsByTagName("td").ToList(); if (tdList.Count < 20) { continue; } string rawId = tdList[1].TextContent; string rawName = tdList[4].TextContent.Replace("\n", "").Replace(" ", ""); string rawType = tdList[0].TextContent.Replace("\n", "").Replace(" ", ""); string rawAntiAir = tdList[9].TextContent; var rawSlot = tdList[18].TextContent.Replace("\n", "").Split(',').ToList(); if (rawSlot.Count == 1 && rawSlot[0] == "") { rawSlot = new List <string>(); } if (rawSlot.Count >= 1 && rawSlot[0].Contains("?")) { continue; } var rawDefaultWeapon = tdList[19].GetElementsByTagName("a").Select(e => e.GetAttribute("href")).ToList(); var kammusu = new Kammusu(int.Parse(rawId), rawName, KammusuTypeReverseDicWikia[rawType], int.Parse(rawAntiAir), rawSlot.Select(s => int.Parse(s)).ToList(), false); Console.WriteLine(rawName); var defaultWeaponList = new List <int>(); foreach (string url in rawDefaultWeapon) { if (!Regex.IsMatch(url, "^/wiki")) { continue; } if (!weaponUtlToId.ContainsKey(url)) { string rawData2 = await client.GetStringAsync($"http://kancolle.wikia.com{url}"); Console.WriteLine(url); var doc2 = default(IHtmlDocument); var parser2 = new HtmlParser(); doc2 = parser2.Parse(rawData2); var tempElement = doc2.QuerySelectorAll("table.infobox > tbody > tr > td > p > b") .Where(e => e.TextContent.Contains("No.")).First(); int no = int.Parse(Regex.Replace(tempElement.TextContent, ".*No.(\\d+).*", "$1")); weaponUtlToId[url] = no; } defaultWeaponList.Add(weaponUtlToId[url]); } 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); }