//questa funzione filtra le carte e ritorna una lista
        public LinkedList<Invocation> getCards(List<Enums.Filter> filterList,Mana manaParam)
        {
            if (filterList.Count == 0) // Se non ci sono filtri, ritorna la lista di tutte le carte.
                return Invocations;

            LinkedList<Invocation> InvTempList = new LinkedList<Invocation>();//lista temporanea su cui caricare le carte filtrate.

            foreach (Invocation InvTemp in Invocations)
            {
                int filterCount = 0; // contatore dei controlli sui filtri.

                if (filterList.Contains(Enums.Filter.Playable)) //Se tra i filtri c'è Playable, verifica che la carta possa essere pagata.
                {
                    bool canPlay = true;
                    if (InvTemp.type.Contains(Enums.Type.Ritual))
                    {
                        Ritual RitTemp = new Ritual(); // Se la carta è un rituale, si verifica anche che vi sia almeno un bersaglio valido.
                        RitTemp.initFromInvocation(InvTemp);
                        List<Enums.Target> targetList = new List<Enums.Target>(); // lista bersagli validi del rituale.
                        foreach (Power powTemp in RitTemp.powers)
                            foreach (string microaction in powTemp.microActions)
                                foreach (Enums.Target targTemp in MicroActions.getTargets(microaction))
                                    targetList.Add(targTemp);
                        if (targetList != null)
                            foreach (Enums.Target tTemp in targetList) // controlla che ci sia almeno 1 target valido.
                            {
                                if (tTemp == Enums.Target.Enemy)
                                    if (Game.EnemyElementals.Count == 0)
                                        canPlay = false;
                                if (tTemp == Enums.Target.Ally)
                                    if (Game.AllyElementals.Count == 0)
                                        canPlay = false;
                                if (tTemp == Enums.Target.Spirit)
                                    if (Game.EnemySpirits.Count == 0 && Game.AllySpirits.Count == 0)
                                        canPlay = false;
                                if (tTemp == Enums.Target.Elemental)
                                    if (Game.AllyElementals.Count == 0 && Game.EnemyElementals.Count == 0)
                                        canPlay = false;
                            }
                    }
                    if (manaParam.CanPay(InvTemp.manaCost) && canPlay)
                        filterCount++;
                    else
                        continue; // se la carta non è Playble, il foreach passa direttamente all'iterazione successiva senza controllare gli altri filtri.
                }
                foreach (Enums.Filter filtro in filterList)// filtra le carte in base alla lista di filtri
                {
                        if (containsType(InvTemp, filtro) ||
                        containsRole(InvTemp, filtro) ||
                        containsSubType(InvTemp, filtro) ||
                        InvTemp.RANK.Equals(filtro.ToString().ToUpper())) //da modificare perche' contiene rank1 non solo 1
                        filterCount++;
                }

                if (filterCount == filterList.Count)//se tutti i controlli vengono passati, aggiunge la carta.
                    InvTempList.AddLast(InvTemp);
            }
            return InvTempList;
        }
        public Card initFromInvocation(Invocation InvTemp)
        {
            if (InvTemp.type[0] == Enums.Type.Elemental)
            {
                Elemental card = new Elemental(InvTemp.name);
                card.name = (string)InvTemp.name.Clone();
                card.manaCost = new Dictionary<Enums.Mana, int>(InvTemp.manaCost);
                card.type = InvTemp.type[0];
                card.subtype = InvTemp.subType[0];
                card.powers = new List<Power>(InvTemp.powers);
                card.castLimit = InvTemp.castLimit;
                card.card = (string)InvTemp.getCard().Clone();

                card.strength = InvTemp.strength;
                card.constitution = InvTemp.constitution;
                card.hp = card.constitution;
                card.rank = InvTemp.rank;
                if (card.rank > 0)
                    card.from = (string)InvTemp.from.Clone();
                card.role = InvTemp.role;
                card.properties = new List<Enums.Properties>(InvTemp.properties);
                card.onAppear = new List<string>(InvTemp.onAppear);
                card.onDeath = new List<string>(InvTemp.onDeath);
                return card;
            }

            if (InvTemp.type[0] == Enums.Type.Ritual)
            {
                Ritual card = new Ritual(InvTemp.name);
                card.name = (string)InvTemp.name.Clone();
                card.manaCost = new Dictionary<Enums.Mana, int>(InvTemp.manaCost);
                card.type = InvTemp.type[0];
                card.subtype = InvTemp.subType[0];
                card.powers = new List<Power>(InvTemp.powers);
                card.castLimit = InvTemp.castLimit;
                card.card = (string)InvTemp.getCard().Clone();

                return card;
            }

            if (InvTemp.type[0] == Enums.Type.Spirit)
            {
                Spirit card = new Spirit(InvTemp.name);
                card.name = (string)InvTemp.name.Clone();
                card.manaCost = new Dictionary<Enums.Mana, int>(InvTemp.manaCost);
                card.type = InvTemp.type[0];
                card.subtype = InvTemp.subType[0];
                card.powers = new List<Power>(InvTemp.powers);
                card.castLimit = InvTemp.castLimit;
                card.card = (string)InvTemp.getCard().Clone();
                Spirit SpiritTemp = new Spirit(this.name);
                SpiritTemp.name = (string)InvTemp.name.Clone();
                SpiritTemp.manaCost = new Dictionary<Enums.Mana, int>(InvTemp.manaCost);
                SpiritTemp.type = InvTemp.type[0];
                SpiritTemp.subtype = InvTemp.subType[0];
                SpiritTemp.powers = new List<Power>(InvTemp.powers);
                SpiritTemp.castLimit = InvTemp.castLimit;
                SpiritTemp.card = InvTemp.getCard();
                SpiritTemp.essence = InvTemp.essence;
                SpiritTemp.onAppear = new List<string>(InvTemp.onAppear);
                SpiritTemp.onDeath = new List<string>(InvTemp.onDeath);
                return card;
            }

            return null;
        }