예제 #1
0
        public DeckResponseDto GenerateDeck([FromBody] GenerateDeckDto dto)
        {
            DeckGenerator generator = new(context, dto);
            Deck          deck      = generator.GenerateDeck();

            return(new DeckResponseDto(deck));
        }
예제 #2
0
        public DeckGenerator(MtGDBContext context, GenerateDeckDto settings)
        {
            this.context = context;
            int seed = settings.Seed ?? Guid.NewGuid().GetHashCode();

            RNG = new Random(seed);

            this.settings = settings;

            if (settings.DeckType == "Commander")
            {
                Card commander = context.GetCardById(settings.CommanderId.Value);
                Card partner   = null;
                if (settings.PartnerId.HasValue)
                {
                    partner = context.GetCardById(settings.PartnerId.Value);
                }

                commanderCreatureTypeIds = new List <int>();
                if (commander?.OracleText?.Contains("is every creature type") != true && partner?.OracleText?.Contains("is every creature type") != true)
                {
                    var creatureTypes = context.Subtypes
                                        .Include(st => st.Cards)
                                        .Where(st => st.Types.Any(t => t.CardType.Name == "Creature"));

                    if (partner != null)
                    {
                        creatureTypes = creatureTypes.Where(st => st.Cards.Any(c => c.CardID == commander.ID || c.CardID == partner.ID));
                    }
                    else
                    {
                        creatureTypes = creatureTypes.Where(st => st.Cards.Any(c => c.CardID == commander.ID));
                    }

                    commanderCreatureTypeIds.AddRange(creatureTypes.Select(st => st.ID));
                }

                deck = new EdhDeck()
                {
                    Commander = commander,
                    Partner   = partner,
                    Singleton = true,
                    Seed      = seed
                };
            }
            else if (settings.DeckType == "Oathbreaker")
            {
                deck = new OathbreakerDeck()
                {
                    Oathbreaker    = context.GetCardById(settings.CommanderId.Value),
                    SignatureSpell = context.GetCardById(settings.SignatureSpellId.Value),
                    Singleton      = true,
                    Seed           = seed
                };
            }
            else
            {
                deck = new Deck()
                {
                    Seed = seed
                };
            }

            format = settings.Format.Replace("Penny Dreadful", "Penny").Replace(" ", string.Empty);

            disabledColorIdentityIds = context.Colors.Where(c => c.Symbol != "C" && !settings.ColorIdentity.Contains(c.Symbol)).Select(t => t.ID).ToList();

            var disabledCardSupertypes = new List <string>();
            var disabledCardTypes      = new List <string>();
            var disabledCardSubtypes   = new List <string>();

            if (settings.BasicLands < 0)
            {
                disabledCardSupertypes.Add("Basic");
            }

            if (settings.NonbasicLands < 0)
            {
                disabledCardTypes.Add("land");
            }

            if (settings.Creatures < 0)
            {
                disabledCardTypes.Add("creature");
            }

            if (settings.Artifacts < 0)
            {
                disabledCardTypes.Add("artifact");
            }

            if (settings.Equipment < 0)
            {
                disabledCardSubtypes.Add("Equipment");
            }

            if (settings.Vehicles < 0)
            {
                disabledCardSubtypes.Add("Vehicle");
            }

            if (settings.Enchantments < 0)
            {
                disabledCardTypes.Add("enchantment");
            }

            if (settings.Auras < 0)
            {
                disabledCardSubtypes.Add("Aura");
            }

            if (settings.Planeswalkers < 0)
            {
                disabledCardTypes.Add("planeswalker");
            }

            if (settings.Spells < 0)
            {
                disabledCardTypes.Add("instant");
                disabledCardTypes.Add("sorcery");
            }

            if (settings.Legendary < 0)
            {
                disabledCardSupertypes.Add("Legendary");
            }

            disabledCardSupertypeIds = context.Supertypes.Where(t => disabledCardSupertypes.Contains(t.Name)).Select(t => t.ID).ToList();
            disabledCardTypeIds      = context.CardTypes.Where(t => disabledCardTypes.Contains(t.Name)).Select(t => t.ID).ToList();
            disabledCardSubtypeIds   = context.Subtypes.Where(t => disabledCardSubtypes.Contains(t.Name)).Select(t => t.ID).ToList();

            if (settings.SharesType < 0)
            {
                foreach (int id in commanderCreatureTypeIds)
                {
                    if (!disabledCardSubtypeIds.Contains(id))
                    {
                        disabledCardSubtypeIds.Add(id);
                    }
                }
            }
        }