public CardDeckDetail(List <CardInfo> allCardInfos, CardCodeAndCount cardCodeAndCount) { this.cardCodeAndCount = cardCodeAndCount; cardInfo = allCardInfos.FirstOrDefault(s => s.cardCode == cardCodeAndCount.CardCode); if (cardInfo == null) { // TODO: エラーログなど } }
/// <summary> /// CardInfoのプロパティを参照して表示するカラムのAspectGetterを設定する /// </summary> /// <param name="objectListView">処理対象のコントロール</param> /// <param name="aspectName">処理対象のカラムのAspectName</param> /// <param name="cardInfos">全てのカード情報</param> /// <param name="propertyInfo">表示するプロパティ</param> public static void SetAspectGetterByIntProperty(ObjectListView objectListView, string aspectName, List <CardInfo> cardInfos, PropertyInfo propertyInfo) { var NameColumn = objectListView.AllColumns.First(s => s.AspectName.Equals(aspectName)); NameColumn.AspectGetter = delegate(object x) { CardCodeAndCount ccac = (CardCodeAndCount)x; CardInfo cardInfo = cardInfos.First(s => s.cardCode == ccac.CardCode); return((int)propertyInfo.GetValue(cardInfo)); }; }
public static CardInfo GetCardInfoFromCardCodeAndCount(List <CardInfo> cardInfos, CardCodeAndCount cardCodeAndCount) { CardInfo cardInfo = cardInfos.FirstOrDefault(s => s.cardCode == cardCodeAndCount.CardCode); if (cardInfo == null) { // TODO: アサート return(null); } return(cardInfo); }
public static CardCodeAndCount GetCardCodeAndCountFromCardInfo(List <CardCodeAndCount> cardCodeAndCounts, CardInfo cardInfo) { CardCodeAndCount cardCodeAndCount = cardCodeAndCounts.FirstOrDefault(s => s.CardCode == cardInfo.cardCode); if (cardCodeAndCount == null) { // TODO: アサート return(null); } return(cardCodeAndCount); }
private void SoleObjectListView_HyperlinkClicked(object sender, BrightIdeasSoftware.HyperlinkClickedEventArgs e) { // クリックされた項目(CardCodeAndCount)と、それに相当するCardInfoを取得する CardDeckDetail cardDeckDetail = (CardDeckDetail)e.Item.RowObject; // デッキ一覧でカードが選択された時の処理を実行する ((Form1)MdiParent)._selectCardInfosInCardsDeck?.Invoke(new List <CardInfo> { cardDeckDetail.cardInfo }); // カード削除しないなら何もせず抜ける if (RemoveCardDisableRadioButton.Checked) { e.Handled = true; return; } // カード削除する CardCodeAndCount targetCardCodeAndCount = _editedDeck.FirstOrDefault(s => s.CardCode == cardDeckDetail.cardCodeAndCount.CardCode); if (targetCardCodeAndCount == null) { return; // TODO: エラー処理方法検討 } // 枚数を1減らす targetCardCodeAndCount.Count -= 1; // 枚数が0ならリストから削除する if (targetCardCodeAndCount.Count == 0) { _editedDeck = _editedDeck.Where( s => s.CardCode != targetCardCodeAndCount.CardCode).ToList(); } MakeSoleList(); e.Handled = true; }
public void SelectCardInfos(List <CardInfo> cardInfos) { // カード追加しないなら何もせず抜ける if (AddCardDisableRadioButton.Checked) { return; } // カード追加する foreach (CardInfo cardInfo in cardInfos) { // コレクタブルでないカードはデッキに追加しない if (!cardInfo.collectible) { continue; } CardCodeAndCount cardCodeAndCount = _editedDeck.FirstOrDefault(s => s.CardCode == cardInfo.cardCode); // 現在のデッキ構成に存在しないカードなら1枚追加する if (cardCodeAndCount == null) { _editedDeck.Add(new CardCodeAndCount() { CardCode = cardInfo.cardCode, Count = 1 }); } else { // 現在のデッキ構成に存在するカードなら、1枚追加するが3枚以上にはしない if (cardCodeAndCount.Count < 3) { cardCodeAndCount.Count += 1; } } } MakeSoleList(); }
public void UpdateCardsDeck(List <CardCodeAndCount> displayDeck) { Util.GetCardInfos(out var allCardInfos, Util.JapaneseCode); // CardCodeAndCountのリストを元にCardDeckDetailのリストを作成する List <CardDeckDetail> deckDetails = new List <CardDeckDetail>(); displayDeck.ForEach(s => deckDetails.Add(new CardDeckDetail(allCardInfos, s))); // チャンピオン、チャンピオン以外のユニット、スペルの順でソートする List <CardDeckDetail> temp = new List <CardDeckDetail>(); temp.AddRange(deckDetails.Where(s => s.cardInfo.type == "ユニット" && s.cardInfo.supertype == "チャンピオン")); temp.AddRange(deckDetails.Where(s => s.cardInfo.type == "ユニット" && s.cardInfo.supertype != "チャンピオン")); temp.AddRange(deckDetails.Where(s => s.cardInfo.type != "ユニット")); deckDetails = temp; // マナコストの幅を定義 List <Point> manacostMinMax = new List <Point> { new Point(0, 1), new Point(2, 2), new Point(3, 3), new Point(4, 4), new Point(5, 5), new Point(6, 6), new Point(7, 100) }; // 定義されたマナコスト毎のリストを作成する List <List <CardDeckDetail> > byManaDecks = new List <List <CardDeckDetail> >(); manacostMinMax.ForEach(minMax => byManaDecks.Add(deckDetails.Where(s => s.cardInfo.cost >= minMax.X && s.cardInfo.cost <= minMax.Y) .ToList())); int cardImageWidth = 136; int cardImageHeight = 205; int yGap = 0; int xGap = 0; int maxYPos = 0; int maxXPos = 0; foreach (List <CardDeckDetail> deck in byManaDecks) { int yPos = 1; foreach (CardDeckDetail cardDeckDetail in deck) { yPos += cardImageHeight + (yGap * cardDeckDetail.cardCodeAndCount.Count); } if (maxYPos < yPos) { maxYPos = yPos; } maxXPos += cardImageWidth + xGap; } // 表示する画像を作成する var bitmap = new Bitmap(maxXPos, maxYPos); // TODO: const using (var canvas = Graphics.FromImage(bitmap)) { canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; int xPos = 1; foreach (List <CardDeckDetail> oneColumnDeck in byManaDecks) { int yPos = 1; foreach (CardDeckDetail oneCardCodeAndCount in oneColumnDeck) { // カードのイメージを作成 // CardInfo target = Util.GetCardInfoFromCardCodeAndCount(allCardInfos, oneCardCodeAndCount); CardInfo target = oneCardCodeAndCount.cardInfo; string cardImageFilePath = Util.GetImageFilePath(target, Util.JapaneseCode); // TODO: 多言語対応 var fileImage = Image.FromFile(cardImageFilePath); var cardImage = FormUtil.GetStretchedImage(fileImage, cardImageWidth, cardImageHeight); // カード枚数のループ CardCodeAndCount cardCodeAndCount = Util.GetCardCodeAndCountFromCardInfo(displayDeck, target); for (int k = 0; k < cardCodeAndCount.Count; k++) { canvas.DrawImage(cardImage, new Point(xPos, yPos)); //TODO: 調整、const yPos += yGap; //TODO: 調整、const } yPos += cardImageHeight - yGap; //TODO: 調整、const } // カードが一枚も無い列だったなら横位置を動かさない if (oneColumnDeck.Count != 0) { xPos += cardImageWidth + xGap; } } } SolePictureBox.Height = bitmap.Height; SolePictureBox.Width = bitmap.Width; SolePictureBox.Image = bitmap; ClientSize = new Size(bitmap.Width, bitmap.Height); }
private void ListOfCardsDeck_Load(object sender, EventArgs e) { // リストビューの諸設定を行う SoleObjectListView.UseHyperlinks = true; SoleObjectListView.ShowGroups = false; // カラムの諸設定を行う var nameList = new List <string> { "cardInfo.name", "cardInfo.cost", "cardInfo.cardType", "cardInfo.region", "cardCodeAndCount.Count" }; var widthList = new List <int> { 120, 20, 80, 50, 80 }; FormUtil.InitColumns(nameList, widthList, SoleObjectListView); // ハイパーリンクの設定 FormUtil.SetHyperlinkOfColumn(SoleObjectListView, "cardInfo.name", true); Util.GetCardInfos(out var cardInfos, Util.JapaneseCode); // カード情報の表示方法を指定 var CardTypeColumn = SoleObjectListView.AllColumns.First(s => s.AspectName.Equals("cardInfo.cardType")); CardTypeColumn.AspectGetter = delegate(object x) { // TODO: typeRefなどが無いため多言語対応出来る見込みが全然ない CardCodeAndCount ccac = ((CardDeckDetail)x).cardCodeAndCount; CardInfo cardInfo = cardInfos.First(s => s.cardCode == ccac.CardCode); if (cardInfo.type == "スペル") { return("スペル"); } else if (cardInfo.supertype == "チャンピオン" && cardInfo.type == "ユニット") { return("チャンピオン"); } else if (cardInfo.supertype != "チャンピオン" && cardInfo.type == "ユニット") { return("フォロワー"); } else { return("不明: type: " + cardInfo.type + " supertype: " + cardInfo.supertype + " subtype: " + cardInfo.subtype); } }; // デッキ情報を読み込む _deckAndNameList = Util.GetDeckAndNameList(); // リストボックスにデッキ情報を表示 FormUtil.RefreshListBox(DecksListBox, _deckAndNameList, "name"); ((Form1)MdiParent)._selectCardInfos += SelectCardInfos; }