Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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;
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }