Example #1
0
        public void toString()
        {
            CardId fairy0 = new CardId(CardType.Fairy, 0);

            Assert.AreEqual("Fairy:0", fairy0.ToString());

            CardId item49 = new CardId(CardType.Item, 49);

            Assert.AreEqual("Item:49", item49.ToString());

            CardId spell105 = new CardId(6881536);

            Assert.AreEqual("Spell:105", spell105.ToString());
        }
Example #2
0
 public override string ToString()
 {
     return(CardId.ToString());
 }
Example #3
0
        public Card(CardId c)
        {
            cardId = c;
            location = null;

            List<SubEffect> fx = new List<SubEffect>();

            keyAbilities = new List<KeyAbility>();
            string castDescription = "";
            int redCost = 0, greenCost = 0, whiteCost = 0, blackCost = 0, blueCost = 0, greyCost = 0;

            string s = cardId.ToString();
            StringBuilder b = new StringBuilder();
            b.Append(s[0]);
            for (int i = 1; i < s.Length; i++)
            {
                char ch = s[i];
                if ((byte)ch <= 90) { b.Append(' '); }

                b.Append(ch);
            }
            auras = new List<Aura>();
            name = b.ToString();
            baseActivatedAbilities = new List<ActivatedAbility>();
            baseTriggeredAbilities = new List<TriggeredAbility>();

            List<SubCost> castingCosts = new List<SubCost>();

            Colour? forceColour = null;
            int? basePower = null, baseToughness = null;

            switch (cardId)
            {
                #region Kappa
                case CardId.Kappa:
                    {
                        blueCost = 2;
                        greyCost = 2;
                        basePower = 1;
                        baseToughness = 3;
                        cardType = CardType.Creature;
                        race = Race.Salamander;
                        activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ExhaustCost(this)),
                            new Effect(new Mill(new ResolveTargetRule(ResolveTarget.CONTROLLER), 4)),
                            true,
                            LocationPile.FIELD,
                        "E: Target player mills 4 cards."));
                    }
                    break;
                #endregion
                #region GrizzlyBear
                case CardId.GrizzlyBear:
                    {
                        greenCost = 2;
                        cardType = CardType.Creature;
                        race = Race.Bear;
                        subType = SubType.Warrior;
                        basePower = 3;
                        baseToughness = 3;
                    }
                    break;
                #endregion
                #region LightningBolt
                case CardId.LightningBolt:
                    {
                        redCost = 1;
                        greyCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 3));
                        castDescription = "Deal 3 damage to target player or creature.";
                    }
                    break;
                #endregion
                #region ForkedLightning
                case CardId.ForkedLightning:
                    {
                        redCost = 1;
                        greyCost = 1;
                        cardType = CardType.Sorcery;
                        fx.Add(new Ping(new FilterTargetRule(2, FilterLambda.ZAPPABLE), 1));
                        castDescription = "Deal 1 damage to 2 target players or creatures.";
                    }
                    break;
                #endregion
                #region SolemnAberration
                case CardId.SolemnAberration:
                    {
                        blackCost = 1;
                        cardType = CardType.Creature;
                        race = Race.Zombie;
                        basePower = 2;
                        baseToughness = 1;
                    }
                    break;
                #endregion
                #region PropheticVision
                case CardId.PropheticVision:
                    {
                        blueCost = 2;
                        cardType = CardType.Sorcery;
                        fx.Add(new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 2));
                        castDescription = "Draw 2 cards.";
                    }
                    break;
                #endregion
                #region DragonHatchling
                case CardId.DragonHatchling:
                    {
                        redCost = 1;
                        cardType = CardType.Creature;
                        race = Race.Dragon;
                        basePower = 1;
                        baseToughness = 1;
                        keyAbilities.Add(KeyAbility.Fervor);
                    }
                    break;
                #endregion
                #region TempleHealer
                case CardId.TempleHealer:
                    {
                        whiteCost = 3;
                        greyCost = 1;
                        cardType = CardType.Creature;
                        race = Race.Human;
                        subType = SubType.Cleric;
                        basePower = 4;
                        baseToughness = 4;
                        EventFilter e = vanillaETB;
                        baseTriggeredAbilities.Add(new TriggeredAbility(this,
                            friendlyETB,
                            underYourControlETBDescription + "gain 1 life.",
                            LocationPile.FIELD, EventTiming.Post, new GainLife(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1)));
                    }
                    break;
                #endregion
                #region Rapture
                case CardId.Rapture:
                    {
                        whiteCost = 2;
                        greyCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.ZAPPABLE, FilterLambda.CREATURE), LocationPile.EXILE));
                        castDescription = "Exile target creature";
                    }
                    break;
                #endregion
                #region CallToArms
                case CardId.CallToArms:
                    {
                        whiteCost = 1;
                        cardType = CardType.Sorcery;
                        fx.Add(new SummonTokens(new ResolveTargetRule(ResolveTarget.CONTROLLER), CardId.Squire, CardId.Squire));
                        castDescription = "Summon two Squires.";
                    }
                    break;
                #endregion
                #region Squire
                case CardId.Squire:
                    {
                        isToken = true;
                        race = Race.Human;
                        baseToughness = 1;
                        basePower = 1;
                        forceColour = Colour.WHITE;

                    }
                    break;
                #endregion
                #region ShimmeringKoi
                case CardId.ShimmeringKoi:
                    {
                        blueCost = 2;
                        greyCost = 2;
                        cardType = CardType.Creature;
                        race = Race.Fish;
                        basePower = 2;
                        baseToughness = 3;
                        baseTriggeredAbilities.Add(new TriggeredAbility(this,
                            thisETB(this),
                            thisETBDescription + "draw a card.",
                            LocationPile.FIELD, EventTiming.Post,
                            new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1)
                            ));
                    }
                    break;
                #endregion
                #region Belwas
                case CardId.Belwas:
                    {
                        whiteCost = 2;
                        greyCost = 1;
                        basePower = 3;
                        baseToughness = 2;
                        cardType = CardType.Creature;
                        race = Race.Human;
                        Aura a = new Aura(
                            (crd) => crd.controller == this.controller && crd.colour == Colour.WHITE && crd != this,
                            Modifiable.Power,
                            1,
                            "Other white creatures you control get +1/+0.");
                        auras.Add(a);
                    }
                    break;
                #endregion
                #region AlterTime
                case CardId.AlterTime:
                    {
                        blueCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new Timelapse(2));
                        fx.Add(new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1));
                        castDescription = "Timelapse 2 " + timelapseReminder2 + "\nDraw a card.";
                    }
                    break;
                #endregion
                #region GrizzlyCub
                case CardId.GrizzlyCub:
                    {
                        greenCost = 1;
                        cardType = CardType.Creature;
                        race = Race.Bear;
                        basePower = 2;
                        baseToughness = 2;
                    }
                    break;
                #endregion
                #region EvolveFangs
                case CardId.EvolveFangs:
                    {
                        greenCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new ModifyUntil(new FilterTargetRule(1, FilterLambda.ZAPPABLE, FilterLambda.CREATURE), Modifiable.Power, never, 2));
                        castDescription = "Target creature gets +2/+0.";
                    }
                    break;
                #endregion
                #region IlasGambit
                case CardId.IlasGambit:
                    {
                        name = "Ila's Gambit";
                        blackCost = 1;
                        castingCosts.Add(new PayLifeCost(3));
                        cardType = CardType.Sorcery;
                        fx.Add(
                            new MoveTo(new SelectFromTargetRule(
                                new ResolveTargetRule(ResolveTarget.CONTROLLER),
                                new FilterTargetRule(1, FilterLambda.PLAYER),
                                p => p.hand.cards.ToArray()),
                            LocationPile.GRAVEYARD));
                        castDescription =
                            "As an additional cost to casting this card pay 3 life.\nLook at target players hand and choose 1 card from it. The chosen card is discarded.";
                    }
                    break;
                #endregion
                #region YungLich
                case CardId.YungLich:
                    {
                        blackCost = 1;
                        blueCost = 1;
                        greyCost = 1;
                        cardType = CardType.Creature;
                        race = Race.Zombie;
                        subType = SubType.Wizard;
                        basePower = 2;
                        baseToughness = 2;
                        triggeredAbilities.Add(new TriggeredAbility(this, thisDies(this),
                            thisDiesDescription + "draw a card.",
                            LocationPile.GRAVEYARD, EventTiming.Post,
                            new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1)));
                    }
                    break;
                #endregion
                #region Unmake
                case CardId.Unmake:
                    {
                        blueCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.ZAPPABLE, FilterLambda.CREATURE), LocationPile.HAND));
                        castDescription = "Return target creature to its owners hand.";
                    }
                    break;
                #endregion
                #region EnragedDragon
                case CardId.EnragedDragon:
                    {
                        redCost = 2;
                        cardType = CardType.Creature;
                        race = Race.Dragon;
                        basePower = 3;
                        baseToughness = 2;
                        triggeredAbilities.Add(new TriggeredAbility(this, thisETB(this), thisETBDescription + " deal 1 damage to target player or creature.",
                            LocationPile.FIELD, EventTiming.Post,
                            () => true,
                            new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 1)));
                    }
                    break;
                #endregion
                #region SteamBolt
                case CardId.SteamBolt:
                    {
                        redCost = 1;
                        blueCost = 1;
                        cardType = CardType.Instant;
                        fx.Add(new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 1));
                        fx.Add(new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1));
                        castDescription = "Deal 1 damage to target creature or player.\nDraw a card.";
                    }
                    break;
                #endregion
                #region IlasGravekeeper
                case CardId.IlasGravekeeper:
                    {
                        name = "Ila's Gravekeeper";
                        blackCost = 3;
                        basePower = 0;
                        baseToughness = 4;
                        cardType = CardType.Creature;
                        race = Race.Zombie;
                        auras.Add(new DynamicAura((a) => a == this, Modifiable.Power, () => owner.field.cards.Count(card => card.race == Race.Zombie), "Ila's Gravekeeper gets +1/+0 for each zombie under your control."));
                    }
                    break;
                #endregion
                #region RottingZombie
                //todo: phrasing and balance
                case CardId.RottingZombie:
                    {
                        //todo: phrasing and balance
                        blackCost = 2;
                        greyCost = 1;
                        basePower = 2;
                        baseToughness = 3;
                        cardType = CardType.Creature;
                        race = Race.Zombie;

                        EventFilter f = (e) =>
                        {
                            if (e.type != GameEventType.MOVECARD) return false;
                            MoveCardEvent mevent = (MoveCardEvent)e;
                            return mevent.from?.pile == LocationPile.FIELD && mevent.to?.pile == LocationPile.GRAVEYARD &&
                                   mevent.card.owner == owner && mevent.card.isCreature && mevent.card != this;
                        };

                    triggeredAbilities.Add(new TriggeredAbility(this, f, "Whenever a friendly creature dies this creature gets +1/+1.", LocationPile.FIELD, EventTiming.Post,
                            new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Power, () => false, 1),
                            new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Toughness, () => false, 1)));
                    }
                    break;
                #endregion
                #region Infiltrator
                case CardId.Infiltrator:
                    {
                        blueCost = 3;
                    basePower = 3;
                    baseToughness = 3;
                        cardType = CardType.Creature;
                        EventFilter f = (e) =>
                        {
                            if (e.type != GameEventType.DAMAGEPLAYER) { return false; }
                            DamagePlayerEvent devent = (DamagePlayerEvent)e;
                            return devent.source == this;
                        };
                    triggeredAbilities.Add(new TriggeredAbility(this, f, "Whenever this creature deals damage to a player that player Mills 3.", LocationPile.FIELD, EventTiming.Post,
                        new Mill(new ResolveTargetRule(ResolveTarget.OPPONENT), 3)));
                    }
                    break;
                #endregion
                #region RiderOfDeath
                case CardId.RiderOfDeath:
                    {
                        name = "Rider of Death";
                        blackCost = 3;
                        greyCost = 2;
                        cardType = CardType.Creature;
                        basePower = 5;
                        baseToughness = 4;
                        triggeredAbilities.Add(new TriggeredAbility(this, thisETB(this), thisETBDescription + "kill target creature.",
                            LocationPile.FIELD, EventTiming.Post, () => true, new MoveTo(new FilterTargetRule(1, FilterLambda.ZAPPABLE, FilterLambda.CREATURE), LocationPile.GRAVEYARD)));
                    }
                    break;
                #endregion
                #region IlatianWineMerchant
                case CardId.IlatianWineMerchant:
                    {
                        blackCost = 1;
                        greyCost = 2;
                        cardType = CardType.Creature;
                        basePower = 1;
                        baseToughness = 2;

                    activatedAbilities.Add(new ActivatedAbility(this, new Cost(new MoveToCost(LocationPile.HAND, LocationPile.GRAVEYARD, 1)), new Effect(new GainLife(new ResolveTargetRule(ResolveTarget.CONTROLLER), 3)), true, LocationPile.FIELD, "Discard a card: Gain 3 life."));
                        //triggeredAbilities.Add(new ActivatedAbility(this, new Cost(), ));
                        /*
                        Card c = fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.INHAND), LocationPile.GRAVEYARD)); //todo jasin: take cost of creature and put it in gainlife
                        fx.Add(new GainLife(new ResolveTargetRule(ResolveTarget.CONTROLLER), c.manacost));
                        */
                    }
                    break;
                #endregion
                #region MeteorRain
                case CardId.MeteorRain: //todo: seba review
                    {
                        redCost = 2;
                        greyCost = 1;
                        cardType = CardType.Sorcery;
                        castDescription = "Deal 3 damage to all creatures.";
                    fx.Add(new Ping(new ResolveTargetRule(ResolveTarget.ALLCREATURES), 3));
                    }
                    break;
                #endregion
                #region FuryOfTheRighteous
                case CardId.FuryOfTheRighteous: //todo: seba review
                    {
                        name = "Fury of the Righteous";
                        whiteCost = 2;
                        greyCost = 2;
                        cardType = CardType.Sorcery;
                        castDescription = "Deal 2 damage to all creatures your opponent controls.";
                    fx.Add(new Ping(new ResolveTargetRule(ResolveTarget.OPPONENTCREATURES), 2));
                    }
                    break;
                #endregion
                #region Extinguish
                case CardId.Extinguish: //todo: seba review
                    {
                        blackCost = 2;
                        cardType = CardType.Instant;
                        castDescription = "Kill target creature.";
                        flavourText = "Be gone!";
                        fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.ZAPPABLE, FilterLambda.CREATURE), LocationPile.GRAVEYARD));
                    }
                    break;
                #endregion
                #region ElderTreeant
                case CardId.ElderTreeant: //todo serious balance and flavor issues
                    {
                    greenCost = 2;
                    greyCost = 1;
                        basePower = 1;
                        baseToughness = 2;
                        cardType = CardType.Creature;
                    activatedAbilities.Add(new ActivatedAbility(this, new Cost(new ManaCost(0,0,0,0,2,1)),
                            new Effect(new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Power, never, 1),
                            new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Toughness, never, 1)), true,
                        LocationPile.FIELD, "1GG: Gain +1/+1."));
                    }
                    break;
                #endregion
                #region EssenceOfDemise
                //todo: each time player casts spell deal one damage to face
                case CardId.EssenceOfDemise:
                    {
                        name = "Essence of Demise";
                        blackCost = 3;
                        greyCost = 1;
                        cardType = CardType.Relic;
                        auras.Add(new Aura((crd) => crd.isCreature, Modifiable.Power, -1, "All creatures get -1/-1."));
                        auras.Add(new Aura((crd) => crd.isCreature, Modifiable.Toughness, -1, ""));
                    }
                    break;
                #endregion
                #region Counterspell
                case CardId.Counterspell:
                    {
                        blueCost = 2;
                        greyCost = 1;
                        cardType = CardType.Instant;
                        castDescription = "Counter target spell.";
                        fx.Add(new CounterSpell(new FilterTargetRule(1, FilterLambda.ONSTACK)));
                    }
                    break;
                #endregion
                #region EssenceOfRage
                case CardId.EssenceOfRage:
                    {
                        name = "Essence of Rage";
                        redCost = 3;
                        greyCost = 1;
                        cardType = CardType.Relic;

                        triggeredAbilities.Add(new TriggeredAbility(this, stepFilter(Step.END), "At the beginning of each end step deal 1 damage to all players.",
                            LocationPile.FIELD, EventTiming.Post, new Ping(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1), new Ping(new ResolveTargetRule(ResolveTarget.OPPONENT), 1)));
                    }
                    break;
                #endregion
                #region EssenceOfClarity
                case CardId.EssenceOfClarity:
                    {
                        name = "Essence of Clarity";
                        blueCost = 3;
                        greyCost = 1;
                        cardType = CardType.Relic;

                        triggeredAbilities.Add(new TriggeredAbility(this, stepFilter(Step.END), "At the beginning of each player's end step that player draws a card.",
                            LocationPile.FIELD, EventTiming.Post, new Draw(new ResolveTargetRule(ResolveTarget.ACTIVE), 1)));
                    }
                    break;
                #endregion
                #region EssenceOfWilderness

                /*
                case CardId.EssenceOfWilderness:
                {
                    name = "Essence of Wilderness";
                    greenCost = 3;
                    cardType = CardType.Relic;

                    EventFilter f = (gevent) =>
                    {
                        if (gevent.type != GameEventType.MOVECARD) return false;
                        MoveCardEvent mevent = (MoveCardEvent) gevent;
                        return mevent.to.pile == LocationPile.FIELD &&mevent.card.cardType == CardType.Creature;
                    };

                    triggeredAbilities.Add(new TriggeredAbility(this, ));
                } break;
                */
                #endregion
                #region EssenceOfValor
                /*
                case CardId.EssenceOfValor:
                {
                    name = "Essence of Valor";
                    whiteCost = 3;
                    cardType = CardType.Relic;

                    //creatures with more than 3 damage cannot attack
                } break;
                */
                #endregion
                #region IlasMagicLamp
                /*
                case CardId.IlasMagicLamp:
                {
                    name = "Ila's Magic Lamp";
                    blackCost = 1;
                    cardType = CardType.Sorcery;

                    //has three charges, get card from deck and shuffle deck

                } break;
                */
                #endregion
                #region StampedingDragon
                case CardId.StampedingDragon:
                    {
                    redCost = 3;
                        baseToughness = 1;
                    basePower = 6;
                        cardType = CardType.Creature; ;

                        keyAbilities.Add(KeyAbility.Fervor);
                    triggeredAbilities.Add(new TriggeredAbility(this, stepFilter(Step.END), "At the end of turn sacrifice this creature.",
                            LocationPile.FIELD, EventTiming.Post, new MoveTo(new ResolveTargetRule(ResolveTarget.SELF), LocationPile.GRAVEYARD)));
                    }
                    break;
                #endregion
                #region MorenianMedic
                case CardId.MorenianMedic:
                    {
                        whiteCost = 2;
                        basePower = 2;
                        baseToughness = 2;
                        activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ExhaustCost(this), new ManaCost(1, 0, 0, 0, 0, 1)),
                            new Effect(new GainLife(new ResolveTargetRule(ResolveTarget.CONTROLLER), 2)),
                            true,
                            LocationPile.FIELD,
                        "E, 1W: Gain 2 life."));
                    }
                    break;
                #endregion
                #region MattysGambit
                case CardId.MattysGambit:
                    {
                        name = "Matty's Gambit";
                        redCost = 1;
                        castingCosts.Add(new PayLifeCost(3));
                        castDescription =
                            "As an additional cost to casting this card pay 3 life.\nDeal 4 damage to target creature or player.";
                        cardType = CardType.Instant;
                        fx.Add(new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 4));
                    }
                    break;
                #endregion
                #region BelwasGambit
                case CardId.BelwasGambit:
                    {
                        name = "Belwas's Gambit";
                        whiteCost = 1;
                        castingCosts.Add(new PayLifeCost(4));
                        castDescription =
                            "As an additional cost to casting this card pay 4 life.\nTarget creature gets +3/+3.";
                        cardType = CardType.Instant;
                        fx.Add(new ModifyUntil(new FilterTargetRule(1, FilterLambda.CREATURE, FilterLambda.ONFIELD), Modifiable.Power, never, 3));
                        fx.Add(new ModifyUntil(new ResolveTargetRule(ResolveTarget.LAST), Modifiable.Toughness, never, 3));
                    }
                    break;
                #endregion
                #region GrazingBison
                case CardId.GrazingBison:
                    {
                        cardType = CardType.Creature;
                        race = Race.Bison;
                        greenCost = 2;
                        greyCost = 2;
                        basePower = 4;
                        baseToughness = 5;
                    }
                    break;
                #endregion
                #region RockhandOgre
                case CardId.RockhandOgre:
                    {
                        cardType = CardType.Creature;
                        race = Race.Ogre;
                        greenCost = 3;
                        greyCost = 3;
                        basePower = 6;
                        baseToughness = 7;
                    }
                    break;
                #endregion
                #region Figment
                case CardId.Figment:
                    {
                        blackCost = 2;
                        greyCost = 1;
                        cardType = CardType.Sorcery;
                        castDescription = "Search your deck for a card and put it to your hand. Shuffle your deck.";
                        fx.Add(new MoveTo(
                            new SelectFromTargetRule(new ResolveTargetRule(ResolveTarget.CONTROLLER), new ResolveTargetRule(ResolveTarget.LAST),
                        (p) => p.deck.cards.ToArray()),
                            LocationPile.HAND));
                        fx.Add(new Shuffle(new ResolveTargetRule(ResolveTarget.CONTROLLER), false));

                    }
                    break;
                #endregion
                #region SebasGambit
                case CardId.SebasGambit:
                    {
                        name = "Seba's Gambit";
                        blueCost = 1;
                        castingCosts.Add(new PayLifeCost(4));
                        castDescription =
                            "As an additional cost to casting this card pay 4 life.\nCounter target spell.";
                        cardType = CardType.Instant;
                        fx.Add(new CounterSpell(new FilterTargetRule(1, FilterLambda.ONSTACK)));
                    }
                    break;
                #endregion
                #region AberrantSacrifice
                case CardId.AberrantSacrifice:
                {
                    blackCost = 2;
                    castingCosts.Add(new MoveToCost(LocationPile.FIELD, LocationPile.GRAVEYARD, 1));
                    cardType = CardType.Sorcery;
                    fx.Add(new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 2));
                    castDescription = "As an additional cost to cast this card sacrifice a creature.\nDraw 2 cards.";
                } break;
                #endregion
                #region Spark
                case CardId.Spark:
                {
                    redCost = 1;
                    cardType = CardType.Instant;
                    fx.Add(new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 2));
                    castDescription = "Deal 2 damage to target creature or player.";
                } break;
                #endregion
                #region MaleficentSpirit
                case CardId.MaleficentSpirit:
                {
                    blackCost = 2;
                    greyCost = 2;
                    basePower = 3;
                    baseToughness = 2;
                    cardType = CardType.Creature;
                    triggeredAbilities.Add(new TriggeredAbility(this,
                        thisETB(this),
                        thisETBDescription + "target player discards a card.",
                        LocationPile.FIELD,
                        EventTiming.Post,
                        new Effect(new MoveTo(new SelectFromTargetRule(
                            new FilterTargetRule(1, FilterLambda.PLAYER),
                            new ResolveTargetRule(ResolveTarget.LAST),
                            p => p.hand.cards.ToArray()), LocationPile.GRAVEYARD))
                        ));
                } break;
                #endregion
                #region Bubastis
                case CardId.Bubastis:
                {
                    blueCost = 4;
                    greyCost = 3;
                    basePower = 5;
                    baseToughness = 5;
                    cardType = CardType.Creature;
                    activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ManaCost(0, 2, 0, 0, 0, 1)),
                        new Effect(new Exhaust(new FilterTargetRule(1, FilterLambda.CREATURE, FilterLambda.ONFIELD))),
                        true,
                        LocationPile.FIELD,
                        "1UU: Exhaust target creature."
                        ));
                } break;
                #endregion
                #region HauntedChapel
                case CardId.HauntedChapel:
                {
                    blackCost = 2;
                    whiteCost = 2;
                    cardType = CardType.Relic;
                    activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ManaCost(1, 0, 1, 0, 0, 0), new MoveToCost(LocationPile.GRAVEYARD, LocationPile.EXILE, 1), new ExhaustCost(this)),
                        new Effect(new SummonTokens(new ResolveTargetRule(ResolveTarget.CONTROLLER), CardId.Spirit)),
                        true,
                        LocationPile.FIELD,
                        "E, BW, Exile a card from your graveyard: Put a 1/1 white Spirit token with flying onto the battlefield."
                        ));
                } break;
                #endregion
                #region Spirit
                case CardId.Spirit:
                {
                    isToken = true;
                    keyAbilities.Add(KeyAbility.Flying);
                    forceColour = Colour.WHITE;
                    basePower = 1;
                    baseToughness = 1;
                } break;
                #endregion
                #region OneWithNature
                case CardId.OneWithNature:
                {
                    greenCost = 1;
                    cardType = CardType.Sorcery;
                    fx.Add(new GainBonusMana(new ResolveTargetRule(ResolveTarget.CONTROLLER), Colour.GREEN, Colour.GREEN, Colour.GREEN));
                    castDescription = "Add GGG until end of step.";
                } break;
                #endregion
                #region MysteriousLilac
                case CardId.MysteriousLilac:
                {
                    blueCost = 1;
                    cardType = CardType.Relic;
                        triggeredAbilities.Add(new TriggeredAbility(this,
                            thisETB(this),
                            thisETBDescription + "draw 1 card.",
                            LocationPile.FIELD,
                            EventTiming.Post,
                            new Effect(new Draw(new ResolveTargetRule(ResolveTarget.CONTROLLER), 1))
                            ));
                    activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ManaCost(0, 0, 0, 0, 0, 2)),
                        new Effect(new GainBonusMana(new ResolveTargetRule(ResolveTarget.CONTROLLER), Colour.BLUE)),
                        true,
                        LocationPile.FIELD,
                        "2: Gain U until end of step."
                        ));
                } break;
                #endregion
                #region Overgrow
                case CardId.Overgrow:
                {
                    greenCost = 2;
                    cardType = CardType.Instant;
                    fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.RELIC, FilterLambda.ONFIELD), LocationPile.GRAVEYARD));
                    castDescription = "Destroy target relic.";
                } break;
                #endregion
                #region Abolish
                case CardId.Abolish:
                    {
                        whiteCost = 2;
                        cardType = CardType.Instant;
                        fx.Add(new MoveTo(new FilterTargetRule(1, FilterLambda.RELIC, FilterLambda.ONFIELD), LocationPile.GRAVEYARD));
                        castDescription = "Destroy target relic.";
                    }
                    break;
                #endregion
                #region ElvenDruid
                case CardId.ElvenDruid:
                {
                    greenCost = 1;
                    cardType = CardType.Creature;
                    basePower = 1;
                    baseToughness = 1;
                    activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ExhaustCost(this)),
                        new Effect(new GainBonusMana(new ResolveTargetRule(ResolveTarget.CONTROLLER), Colour.GREEN)),
                        true,
                        LocationPile.FIELD,
                        "E: Gain G until end of step."
                        ));
                } break;
                #endregion
                #region ChromaticUnicorn
                case CardId.ChromaticUnicorn:
                {
                    greenCost = 1;
                    cardType = CardType.Creature;
                    basePower = 1;
                    baseToughness = 1;
                    auras.Add(new DynamicAura(crd => this == crd,
                        Modifiable.Power,
                        () => owner.getMaxMana((int)Colour.RED) > 0 ? 2 : 0,
                        "This creature gets +2/+0 as long as you have a red mana orb."
                        ));
                    auras.Add(new DynamicAura(crd => this == crd,
                        Modifiable.Toughness,
                        () => owner.getMaxMana((int)Colour.WHITE) > 0 ? 2 : 0,
                        "This creature gets +0/+2 as long as you have a white mana orb."
                        ));
                    } break;
                #endregion
                #region Flamemane
                case CardId.Flamemane:
                {
                    redCost = 3;
                    greyCost = 1;
                    cardType = CardType.Creature;
                    basePower = 4;
                    baseToughness = 4;
                    keyAbilities.Add(KeyAbility.Flying);
                    activatedAbilities.Add(new ActivatedAbility(this,
                        new Cost(new ManaCost(0, 0, 0, 2, 0, 0)),
                        new Effect(new Ping(new FilterTargetRule(1, FilterLambda.ZAPPABLE), 1)),
                        true,
                        LocationPile.FIELD,
                        "RR: Deal 1 damage to target creature or player."
                        ));
                } break;
                #endregion
                #region CoupDeGrace
                case CardId.CoupDeGrace:
                {
                    whiteCost = 1;
                    cardType = CardType.Instant;
                    fx.Add(
                        new MoveTo(
                            new FilterTargetRule(1, FilterLambda.CREATURE, FilterLambda.ONFIELD, FilterLambda.EXHAUSTED),
                            LocationPile.GRAVEYARD));
                    castDescription = "Destroy target exhausted creature.";
                }
                    break;

                    #endregion
                #region LoneRanger
                case CardId.LoneRanger:
                {
                    //better if it isnt when summoned, instead it should be dynamic when no other creatures are on board?
                    //filter doesn't account for relics on board
                    greenCost = 2;
                    cardType = CardType.Creature;
                    basePower = 2;
                    baseToughness = 2;
                    auras.Add(new DynamicAura(crd => crd == this,
                        Modifiable.Power,
                        () => owner.field.cards.Count() == 1 ? 1 : 0,
                        "This creature gains +1/+2 as long as you control no other permanents."));
                    auras.Add(new DynamicAura(crd => crd == this,
                        Modifiable.Toughness,
                        () => owner.field.cards.Count() == 1 ? 2 : 0,
                        ""));
                    } break;
                #endregion
                #region DecayingZombie
                case CardId.DecayingZombie:
                {
                    cardType = CardType.Creature;
                    blackCost = 2;
                    basePower = 4;
                    baseToughness = 5;
                    triggeredAbilities.Add(new TriggeredAbility(this, stepFilter(Step.END, true), "At the beginning of your endstep this creature gains -1/-1.",
                        LocationPile.FIELD, EventTiming.Post,
                        new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Power, never, -1),
                        new ModifyUntil(new ResolveTargetRule(ResolveTarget.SELF), Modifiable.Toughness, never, -1)));
                    race = Race.Zombie;
                } break;
                #endregion

                #region AsylumWarden
                case CardId.AsylumWarden:
                {
                    cardType = CardType.Creature;
                    blackCost = 1;
                    whiteCost = 1;
                    basePower = 2;
                    baseToughness = 2;
                        triggeredAbilities.Add(new TriggeredAbility(this, thisDies(this),
                                thisDiesDescription + "put a 1/1 white Spirit token with flying onto the battlefield.",
                                LocationPile.GRAVEYARD, EventTiming.Post,
                                new SummonTokens(new ResolveTargetRule(ResolveTarget.CONTROLLER), CardId.Spirit)));
                    } break;
                #endregion
                #region default
                default:
                    {
                        throw new Exception("pls no" + c.ToString());
                    }
                #endregion
            }
            if (basePower != null)
            {
                power = new Modifiable<int>(add, sub);
                power.setBaseValue(basePower.Value);
                toughness = new Modifiable<int>(add, sub);
                toughness.setBaseValue(baseToughness.Value);
            }

            Effect x = new Effect(fx.ToArray());
            castingCost = new ManaCost(whiteCost, blueCost, blackCost, redCost, greenCost, greyCost);
            castingCosts.Add(castingCost);
            Cost cc = new Cost(castingCosts.ToArray());
            castAbility = new ActivatedAbility(this,
                cc,
                new Effect(fx.ToArray()),
                cardType == CardType.Instant,
                LocationPile.HAND, castDescription);
            baseActivatedAbilities.Add(castAbility);

            if ((basePower == null) != (baseToughness == null))
            {
                throw new Exception("bad thing b0ss");
            }

            var vs = castingCost.costsEnumerable;
            List<int> n = new List<int>();
            int ctr = 0;
            foreach (var v in vs)
            {
                if (v != 0)
                {
                    n.Add(ctr);
                }
                if (++ctr == 5)
                {
                    break;
                }
            }
            if (n.Count() == 0)
            {
                if (!forceColour.HasValue)
                {
                    colour = Colour.GREY;
                }
                else
                {
                    colour = forceColour.Value;
                }
            }
            else if (n.Count() == 1)
            {
                colour = (Colour)n.First();
            }
            else
            {
                colour = Colour.MULTI;
            }
        }
Example #4
0
        private void BuildCard(CardTypes cardType)
        {
            BuildMenu();
            var cardBodyLayout = new FlowLayoutPanel
            {
                FlowDirection = FlowDirection.TopDown, Dock = DockStyle.Fill, ContextMenuStrip = contextMenu,
            };

            cardBodyLayout.MouseDown += CardBodyLayout_MouseDown;

            this.BorderStyle = BorderStyle.FixedSingle;


            SetBackColor(this, cardType);


            this.Margin = new Padding(10, 20, 10, 10);
            this.Width  = 240;
            this.Height = 120;
            //Id
            var IdLabel = new Label()
            {
                Text  = CardId.ToString(),
                Width = 25,

                BorderStyle = BorderStyle.None
            };

            cardBodyLayout.Controls.Add(IdLabel);
            //Name row
            var nameLabel = new Label
            {
                Text = CardName, Width = 200, BorderStyle = BorderStyle.None,
                Name = "nameLabel",
            };

            _globalToolTip.SetToolTip(nameLabel, CardName);
            cardBodyLayout.Controls.Add(nameLabel);

            var propertiesLayout = new FlowLayoutPanel()
            {
                FlowDirection = FlowDirection.LeftToRight, Size = new Size(200, 30)
            };
            var pointsLabel = new Label()
            {
                Text = "Points: ", Width = 40
            };

            propertiesLayout.Controls.Add(pointsLabel);
            var pointsValue = new Label()
            {
                Text = CardPoints.ToString(), Width = 25, Name = "pointsLabel"
            };

            propertiesLayout.Controls.Add(pointsValue);


            var controlsLayout = new FlowLayoutPanel
            {
                Size = new Size(235, 30), FlowDirection = FlowDirection.RightToLeft
            };
            var editButton = new Button()
            {
                Text = "Edit"
            };

            editButton.Click += EditButton_Click;
            var viewButton = new Button()
            {
                Text = "View"
            };

            viewButton.Click += ViewButton_Click;
            controlsLayout.Controls.Add(editButton);
            controlsLayout.Controls.Add(viewButton);
            cardBodyLayout.Controls.Add(propertiesLayout);
            cardBodyLayout.Controls.Add(controlsLayout);
            this.Controls.Add(cardBodyLayout);
        }
Example #5
0
 public override string ToString()
 {
     return($"Title: {Title}. CardId: {CardId.ToString().Substring(0, 6)}. Rarity: {Rarity}.");
 }