public CardDeckDetail(List <CardInfo> allCardInfos, CardCodeAndCount cardCodeAndCount)
 {
     this.cardCodeAndCount = cardCodeAndCount;
     cardInfo = allCardInfos.FirstOrDefault(s => s.cardCode == cardCodeAndCount.CardCode);
     if (cardInfo == null)
     {
         // TODO: エラーログなど
     }
 }
Пример #2
0
        /// <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));
            };
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }
Пример #6
0
        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);
        }
Пример #8
0
        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;
        }