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); }