private void BtnSelectCardsDatabase_Click(object sender, EventArgs e) { ofd.FileName = string.Empty; ofd.CheckFileExists = true; ofd.ValidateNames = true; ofd.ShowReadOnly = false; ofd.ReadOnlyChecked = false; ofd.Filter = "Manifest Database (*.data)|*.data"; var r = ofd.ShowDialog(this); if (r == DialogResult.Cancel) { return; } var filePath = ofd.FileName; var bytes = File.ReadAllBytes(filePath); AssetInfoList assetInfoList; try { assetInfoList = AssetInfoList.Parse(bytes, MltdConstants.Utf8WithoutBom); } catch (Exception ex) { MessageBox.Show(ex.ToString(), ApplicationHelper.GetApplicationTitle(), MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } txtCardsDatabasePath.Text = filePath; lvwCards.Items.Clear(); var cardNameRegex = new Regex(@"^card_list_(?<idolIndex>\d{3})(?<idolAbbr>[a-z]{3})(?<ser>\d{4})\.acb\.unity3d$", RegexOptions.CultureInvariant); var cardList = _cardList; var idols = MltdConstants.Idols; cardList.Clear(); foreach (var assetInfo in assetInfoList.Assets) { var match = cardNameRegex.Match(assetInfo.ResourceName); if (!match.Success) { continue; } var idolID = Convert.ToInt32(match.Groups["idolIndex"].Value); var detectedIdolAbbr = match.Groups["idolAbbr"].Value; if (idolID < 1 || idolID > idols.Count) { Debug.Print("Warning: idol index out of range: {0} with abbr {1}", idolID, detectedIdolAbbr); continue; } var idol = idols[idolID - 1]; if (idol.Abbreviation != detectedIdolAbbr) { Debug.Print("Warning: detected abbr {0} does not match standard abbr {1}.", detectedIdolAbbr, idol.Abbreviation); continue; } var serial = match.Groups["ser"].Value; var serialInt = Convert.ToInt32(serial); var rarity = (Rarity)(serialInt % 10); serial = TheaterHelper.GetIdolSerialAbbreviation(idolID) + serial; var entry = (idol.Name, idol.Color, rarity, serial); cardList.Add(entry); } foreach (var entry in cardList) { var lvi = lvwCards.Items.Add(entry.Idol); lvi.SubItems.Add(entry.Color.ToString()); lvi.SubItems.Add(entry.Rarity.ToString()); lvi.SubItems.Add(entry.Serial); } lvwCards.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); }