public Outcome ResolveEffect(DungeonMaster DM, Character user, Position posTarget, Deck deck, Card cardDrawn,
                                     List <Effect> typicalEffects)
        {
            var outcome = new Outcome();

            //TODO: add slime splitting
            if (cardDrawn.TypeOfCard == Card.CardType.Armor)
            {
                //TODO: more elegant method
                if (cardDrawn.Name == "Split")
                {
                    var emptySpaces = DM.GetEmptyAdjacentSquares(Pos);
                    if (emptySpaces.Count != 0)
                    {
                        //int i = DungeonMaster.rand.Next(emptySpaces.Count);
                        int i          = 0; //TODO: derandomized for now for networking reasons
                        var emptySpace = emptySpaces[i];
                        Vitality.Value = Vitality.Value / 2;
                        var cloneCharacter = this.Clone() as Character;
                        cloneCharacter.InitializeIndividual("Copy of " + Name, emptySpace, SideID, DM.GuidsInWaiting.Dequeue());
                        DM.CreateCharacter(cloneCharacter);
                    }
                }

                if (cardDrawn.Name == "Burn")
                {
                    if (user != null)
                    {
                        user.TakeDamage(DamageEffect.DamageType.Fire, 1);
                    }
                }

                //reduce damage
                var damage = typicalEffects.FirstOrDefault(e => e.TypeOfEffect == Effect.EffectType.Damage) as DamageEffect;
                if (damage != null)
                {
                    int amount        = damage.GetAmount(DM, user, posTarget, this);
                    int x             = Math.Max(0, amount - ArmorProtection);
                    var reducedDamage = new DamageEffect(damage.TypeOfDamage, x);
                    reducedDamage.Apply(DM, user, posTarget, this, deck, cardDrawn);
                    outcome.Message.AppendLine("Damage reduced to " + x + " by armor");
                }

                var slimeArmor = Conditions.FirstOrDefault(c => c.Name == "Slime Armor");
                if (slimeArmor != null)
                {
                    slimeArmor.Value -= 1;
                    if (slimeArmor.Value <= 0)
                    {
                        Conditions.Remove(slimeArmor); //TODO: auto remove if goes below 0?
                    }
                }
            }

            return(outcome);
        }