private int getSpecialCardComboPenalitys(CardDB.Card card, Minion target, Playfield p, bool lethal, int choice, int manaCostCard)
        {
            CardDB.cardName name = card.name;

            if (lethal && card.type == CardDB.cardtype.MOB)
            {
                if (this.lethalHelpers.ContainsKey(name))
                {
                    return 0;
                }

                if (this.DamageTargetDatabase.ContainsKey(name) || this.DamageAllDatabase.ContainsKey(name) )
                {
                    return 0;
                }

                if (this.buffingMinionsDatabase.ContainsKey(name))
                {
                    if (name == CardDB.cardName.timberwolf || name == CardDB.cardName.houndmaster)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.PET) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.warsongcommander)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.charge>=1) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.southseacaptain)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.PIRATE) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    if (name == CardDB.cardName.murlocwarleader || name == CardDB.cardName.grimscaleoracle || name == CardDB.cardName.coldlightseer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.MURLOC) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.warhorsetrainer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready &&  mm.name == CardDB.cardName.silverhandrecruit) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.malganis)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && mm.handcard.card.race == TAG_RACE.DEMON) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                }
                else
                {
                    if (name == CardDB.cardName.theblackknight)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.enemyMinions)
                        {
                            if (mm.taunt) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    else
                    {
                        if ((this.HealTargetDatabase.ContainsKey(name) || this.HealHeroDatabase.ContainsKey(name) || this.HealAllDatabase.ContainsKey(name)))
                        {
                            int beasts = 0;
                            foreach (Minion mm in p.ownMinions)
                            {
                                if (mm.Ready && mm.handcard.card.name == CardDB.cardName.lightwarden) beasts++;
                            }
                            if (beasts == 0) return 500;
                        }
                        else
                        {
                            //ignore that minion if it does not have charge, or we can give him charge ---> warsong was deleted ;_;
                            if (!(name == CardDB.cardName.nightblade || card.Charge || this.silenceDatabase.ContainsKey(name) || ((TAG_RACE)card.race == TAG_RACE.PET && p.ownMinions.Find(x => x.name == CardDB.cardName.tundrarhino) != null) || p.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null))
                            {
                                return 500;
                            }
                        }
                    }
                }
            }

            //lethal end########################################################

            //bonus for early thread
            if (p.ownMaxMana == 1 )
            {
                //if (card.name == CardDB.cardName.nerubianegg) return -10;
                if (card.name == CardDB.cardName.lepergnome) return -10;
                if (card.name == CardDB.cardName.faeriedragon) return -20;
                if (card.name == CardDB.cardName.shrinkmeister) return 0;
                if (card.Attack >= 3 && card.Health >= 2) return -20;
                if (card.name == CardDB.cardName.wildgrowth) return -150;
                
            }

            if (p.ownMaxMana == 2)
            {
                if (card.name == CardDB.cardName.nerubianegg) return -15;
            }

            /*if (card.name == CardDB.cardName.flamewaker && p.turnCounter == 0)
            {
                int number =0;
                foreach (Action a in p.playactions)
                {
                    if (a.card!=null && a.card.card.type == CardDB.cardtype.SPELL) number++;
                }
                return number * 10;
            }*/



            if (card.name == CardDB.cardName.unstableportal && p.owncards.Count <= 9) return -15;

            if (card.name == CardDB.cardName.daggermastery)
            {
                if (p.ownWeaponAttack >= 2 || p.ownWeaponDurability >= 2) return 5;
            }

            if (card.name == CardDB.cardName.upgrade)
            {
                if (p.ownWeaponDurability == 0)
                {
                    return 16;
                }
            }

            if (card.name == CardDB.cardName.baronrivendare)
            {
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.deathlord || mnn.name == CardDB.cardName.zombiechow || mnn.name == CardDB.cardName.dancingswords) return 30;
                }
            }

            //rule for coin on early game
            if (p.ownMaxMana < 3 && card.name == CardDB.cardName.thecoin)
            {
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.manacost <= p.ownMaxMana && hc.card.type == CardDB.cardtype.MOB) return 5;
                }

            }

            if (name == CardDB.cardName.flare) 
            {
                if (p.enemyHeroName != HeroEnum.hunter && p.enemyHeroName != HeroEnum.mage && p.enemyHeroName == HeroEnum.pala) return 0;
                //it is a hunter/mage or pala:
                if (p.enemySecretCount == 0) return 50;
                if (p.enemySecretCount >= 1 && p.playactions.Count == 0)  return -10;
            }

            //some effects, which are bad :D
            int pen = 0;
            if (name == CardDB.cardName.houndmaster)
            {
                if (target == null) return 50;
            }

            if ((card.name == CardDB.cardName.biggamehunter) && (target == null || target.own))
            {
                return 40;
            }
            if (name == CardDB.cardName.aldorpeacekeeper && target == null)
            {
                pen = 30;
            }

            if (name == CardDB.cardName.sylvanaswindrunner && p.enemyMinions.Count == 0)
            {
                return 50;
            }

            if (name == CardDB.cardName.cabalshadowpriest && target == null)
            {
                return 40;
            }

            if (name == CardDB.cardName.emergencycoolant && target != null && target.own)//dont freeze own minions
            {
                pen = 500;
            }

            if (name == CardDB.cardName.shatteredsuncleric && target == null) { pen = 10; }
            if (name == CardDB.cardName.argentprotector)
            {
                if (target == null) { pen = 20; }
                else
                {
                    if (!target.own) { return 500; }
                    if (target.divineshild) { pen = 15; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion) { pen = 10; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion && target.Angr <= 2 && target.Hp <= 2) { pen = 15; }
                }

            }

            if (name == CardDB.cardName.facelessmanipulator)
            {
                if (target == null)
                {
                    return 50;
                }
                if (target.Angr >= 5 || target.handcard.card.cost >= 5 || (target.handcard.card.rarity == 5 || target.handcard.card.cost >= 3))
                {
                    return 0;
                }
                return 49;
            }

            if (name == CardDB.cardName.ancientofwar)
            {
                if (p.enemyMinions.Count > 0 && choice == 1) return 200;
                if (p.enemyMinions.Count == 0 && choice == 2) return 50;
            }

            if (name == CardDB.cardName.druidoftheflame)
            {

                if (p.enemyMinions.Count > 0 && choice == 2) return 40;
                if (p.enemyMinions.Count == 0 && choice == 1) return 40;

            }

            if (name == CardDB.cardName.gangup && target!=null)
            {
                if(target.handcard.card.isToken) return 20;
                if (target.handcard.card.isSpecialMinion) return -20;
                
                
            }

            if (name == CardDB.cardName.theblackknight)
            {
                if (target == null)
                {
                    return 50;
                }

                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.taunt && (target.Angr >= 3 || target.Hp >= 3)) return 0;
                }
                return 20;
            }

            //------------------------------------------------------------------------------------------------------
            Minion m = target;

            if (card.name == CardDB.cardName.reincarnate)
            {
                if (m.own)
                {
                    if (m.handcard.card.deathrattle || m.ancestralspirit >= 1 || m.souloftheforest >= 1 || m.enemyBlessingOfWisdom >= 1 || m.explorersHat >=1) return 0;
                    if (m.handcard.card.Charge && ((m.numAttacksThisTurn == 1 && !m.windfury) || (m.numAttacksThisTurn == 2 && m.windfury))) return 0;
                    if (m.wounded || m.Angr < m.handcard.card.Attack || (m.silenced && PenalityManager.instance.specialMinions.ContainsKey(m.name))) return 0;


                    bool hasOnMinionDiesMinion = false;
                    foreach (Minion mnn in p.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.scavenginghyena && m.handcard.card.race == TAG_RACE.PET) hasOnMinionDiesMinion = true;
                        if (mnn.name == CardDB.cardName.flesheatingghoul || mnn.name == CardDB.cardName.cultmaster) hasOnMinionDiesMinion = true;
                    }
                    if (hasOnMinionDiesMinion) return 0;

                    return 500;
                }
                else
                {
                    if (m.name == CardDB.cardName.nerubianegg && m.Angr <= 4 && !m.taunt) return 500;
                    if (m.taunt && !m.handcard.card.tank) return 0;
                    if (m.enemyBlessingOfWisdom >= 1) return 0;
                    if (m.Angr > m.handcard.card.Attack || m.Hp > m.handcard.card.Health) return 0;
                    if (m.name == CardDB.cardName.abomination || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.unstableghoul || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;

                }

            }


            if (name == CardDB.cardName.madbomber || name == CardDB.cardName.madderbomber)
            {
                //penalize for any own minions with health equal to potential attack amount
                //to lessen risk of losing your own minion
                int maxAtk = 3;
                if (name == CardDB.cardName.madderbomber) maxAtk = 6;
                if (maxAtk >= p.ownHero.Hp && maxAtk < p.enemyHero.Hp) return 500;//we could be killed, but not enemy >_< .. otherwise YOLO
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.Hp <= maxAtk)
                    {
                        if (mnn.Ready) pen += 20; 
                    }
                }

                /*
                int numTargets = 2 + p.ownMinions.Count + p.enemyMinions.Count;
                int numOwnTargets = 1 + p.ownMinions.Count;
                int numEnemyTargets = numTargets-numOwnTargets;
                double dmgpertarget = ((double)maxAtk)/((double)numTargets);
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.Hp <= dmgpertarget)
                    {
                        pen += 10;
                    }
                }
                */
            }

            if (name == CardDB.cardName.goblinblastmage)
            {
                bool mechOnField = false;

                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.handcard.card.race == TAG_RACE.MECHANICAL)
                    {
                        mechOnField = true;
                        break;
                    }
                }

                if (! mechOnField)
                {
                    int manacost = card.getManaCost(p, manaCostCard);
                    foreach (Handmanager.Handcard hc in p.owncards)
                    {
                        if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= (hc.getManaCost(p) + manacost)) return 500;//hc.card.race Should work? Nohero please confirm!
                        if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= hc.getManaCost(p)) return 50;

                    }
                }
                else
                {
                    return 20;
                }
            }

            if (card.name == CardDB.cardName.knifejuggler && p.mobsplayedThisTurn > 1 || (p.ownHeroName == HeroEnum.shaman && p.ownAbilityReady == false))
            {
                return 20;
            }

            if (card.name == CardDB.cardName.flametonguetotem && p.ownMinions.Count == 0)
            {
                return 100;
            }

            if (card.name == CardDB.cardName.stampedingkodo)
            {
                bool found = false;
                foreach (Minion mi in p.enemyMinions)
                {
                    if (mi.Angr <= 2) found = true;
                }
                if (!found) return 20;
            }

            if (name == CardDB.cardName.windfury)
            {
                if (!m.own) return 500;
                if (m.own && !m.Ready) return 500;
            }

            if ((name == CardDB.cardName.wildgrowth || name == CardDB.cardName.nourish) && p.ownMaxMana == 9 && !(p.ownHeroName == HeroEnum.thief && p.cardsPlayedThisTurn == 0))
            {
                return 500;
            }

            if (name == CardDB.cardName.ancestralspirit)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.name == CardDB.cardName.deathlord || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;
                }
                if (target.own && !target.isHero)
                {
                    if (this.specialMinions.ContainsKey(m.name)) return -5;
                    return 0;
                }

            }

            if (name == CardDB.cardName.sylvanaswindrunner)
            {
                if (p.enemyMinions.Count == 0)
                {
                    return 10;
                }
            }

            if (name == CardDB.cardName.betrayal && !target.own && !target.isHero)
            {
                if (m.Angr == 0) return 30;
                if (p.enemyMinions.Count == 1) return 30;
            }




            if (name == CardDB.cardName.bite)
            {
                if ((p.ownHero.numAttacksThisTurn == 0 || (p.ownHero.windfury && p.ownHero.numAttacksThisTurn == 1)) && !p.ownHero.frozen)
                {

                }
                else
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.deadlypoison)
            {
                return -p.ownWeaponDurability * 2;
            }

            if (name == CardDB.cardName.shadydealer)
            {
                bool haspirate = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.handcard.card.race == TAG_RACE.PIRATE)
                    {
                        haspirate = true;
                        break;
                    }
                }
                if (haspirate) return 0;
                else return 10;

            }

            if (name == CardDB.cardName.coldblood)
            {
                if (lethal) return 0;
                return 25;
            }

            if (name == CardDB.cardName.bloodmagethalnos)
            {
                return 10;
            }

            if (name == CardDB.cardName.frostbolt)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.handcard.card.cost <= 2)
                        return 15;
                }
                return 8;
            }

            if (!lethal && choice == 1 && name == CardDB.cardName.druidoftheclaw)
            {
                return 20;
            }


            if (name == CardDB.cardName.poweroverwhelming)
            {
                if (target.own && !target.isHero && !m.Ready)
                {
                    return 500;
                }
            }

            if (name == CardDB.cardName.frothingberserker)
            {
                if (p.cardsPlayedThisTurn >= 1) pen = 5;
            }

            if (name == CardDB.cardName.handofprotection)
            {
                if (m.Hp == 1) pen = 15;
            }

            if (lethal)
            {
                if (name == CardDB.cardName.corruption)
                {
                    int beasts = 0;
                    foreach (Minion mm in p.ownMinions)
                    {
                        if (mm.Ready && (mm.handcard.card.name == CardDB.cardName.questingadventurer || mm.handcard.card.name == CardDB.cardName.archmageantonidas || mm.handcard.card.name == CardDB.cardName.manaaddict || mm.handcard.card.name == CardDB.cardName.manawyrm || mm.handcard.card.name == CardDB.cardName.wildpyromancer)) beasts++;
                    }
                    if (beasts == 0) return 500;
                }
            }

            if (name == CardDB.cardName.divinespirit)
            {
                if (lethal)
                {
                    if (!target.own && !target.isHero)
                    {
                        if (!m.taunt)
                        {
                            return 500;
                        }
                        else
                        {
                            // combo for killing with innerfire and biggamehunter
                            if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && (m.Hp >= 4 || (p.owncards.Find(x => x.card.name == CardDB.cardName.divinespirit) != null && m.Hp >= 2)))
                            {
                                return 0;
                            }
                            return 500;
                        }
                    }
                }
                else
                {
                    if (!target.own && !target.isHero)
                    {

                        // combo for killing with innerfire and biggamehunter
                        if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && m.Hp >= 4)
                        {
                            return 0;
                        }
                        return 500;
                    }

                }

                if (target.own && !target.isHero)
                {

                    if (m.Hp >= 4)
                    {
                        return 0;
                    }
                    return 15;
                }

            }



            if (name == CardDB.cardName.knifejuggler)
            {
                if (p.mobsplayedThisTurn >= 1)
                {
                    return 20;
                }
            }

            if ((name == CardDB.cardName.polymorph || name == CardDB.cardName.hex))
            {



                if (target.own && !target.isHero)
                {
                    return 500;
                }

                if (!target.own && !target.isHero)
                {
                    if (target.allreadyAttacked) return 30;
                    Minion frog = target;
                    if (this.priorityTargets.ContainsKey(frog.name)) return 0;
                    if (frog.Angr >= 4 && frog.Hp >= 4) return 0;
                    return 30;
                }

            }


            if ((name == CardDB.cardName.defenderofargus || name == CardDB.cardName.sunfuryprotector) && p.ownMinions.Count == 1)
            {
                return 40;
            }
            if ((name == CardDB.cardName.defenderofargus || name == CardDB.cardName.sunfuryprotector) && p.ownMinions.Count == 0)
            {
                return 50;
            }

            if (name == CardDB.cardName.unleashthehounds)
            {
                if (p.enemyMinions.Count <= 1)
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.equality) // aoe penality
            {
                int hpdestroyed = 0;
                foreach (Minion mini in p.enemyMinions)
                {
                    hpdestroyed += (mini.Hp - 1);
                }

                if (p.enemyMinions.Count <= 2 || hpdestroyed <= 4)
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.bloodsailraider && p.ownWeaponDurability == 0)
            {
                //if you have bloodsailraider and no weapon equiped, but own a weapon:
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.card.type == CardDB.cardtype.WEAPON) return 10;
                }
            }



            if (name == CardDB.cardName.innerfire)
            {
                if (m.name == CardDB.cardName.lightspawn) pen = 500;
            }

            if (name == CardDB.cardName.huntersmark)
            {
                if (target.own && !target.isHero) pen = 500; // dont use on own minions
                if (!target.own && !target.isHero && (target.Hp <= 4) && target.Angr <= 4) // only use on strong minions
                {
                    pen = 20;
                }
            }


            if ((name == CardDB.cardName.aldorpeacekeeper || name == CardDB.cardName.humility))
            {
                if (target != null)
                {
                    if (target.own) pen = 500; // dont use on own minions
                    if (!target.own && target.Angr <= 3) // only use on strong minions
                    {
                        pen = 30;
                    }
                    if (m.name == CardDB.cardName.lightspawn) pen = 500;
                }
                else
                {
                    pen = 50;
                }
            }



            if (name == CardDB.cardName.defiasringleader && p.cardsPlayedThisTurn == 0)
            { pen = 10; }
            if (name == CardDB.cardName.bloodknight)
            {
                int shilds = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                foreach (Minion min in p.enemyMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                if (shilds == 0)
                {
                    pen = 10;
                }
            }
            if (name == CardDB.cardName.direwolfalpha)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                { pen = 5; }
            }
            if (name == CardDB.cardName.abusivesergeant)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                {
                    pen = 5;
                }
            }

            if (p.turnCounter >= 1 && name == CardDB.cardName.reversingswitch && target.Angr == target.Hp) return 500;

            

            return pen;
        }
Beispiel #2
0
        private int getSpecialCardComboPenalitys(CardDB.Card card, Minion target, Playfield p, bool lethal, int choice, int manaCostCard)
        {
            CardDB.cardName name = card.name;

            if (lethal && card.type == CardDB.cardtype.MOB)
            {
                if (this.lethalHelpers.ContainsKey(name))
                {
                    return 0;
                }

                if (this.DamageTargetDatabase.ContainsKey(name) || this.DamageAllDatabase.ContainsKey(name) )
                {
                    return 0;
                }

                if (this.buffingMinionsDatabase.ContainsKey(name))
                {
                    if (name == CardDB.cardName.timberwolf || name == CardDB.cardName.houndmaster)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.PET) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    
                    if (name == CardDB.cardName.warsongcommander)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.charge>=1) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.southseacaptain)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.PIRATE) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    if (name == CardDB.cardName.murlocwarleader || name == CardDB.cardName.grimscaleoracle || name == CardDB.cardName.coldlightseer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.MURLOC) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.warhorsetrainer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && mm.name == CardDB.cardName.silverhandrecruit) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    if (name == CardDB.cardName.malganis)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.Ready && mm.handcard.card.race == TAG_RACE.DEMON) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                }
                else
                {
                    if (name == CardDB.cardName.theblackknight)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.enemyMinions)
                        {
                            if (mm.taunt) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    else
                    {
                        if ((this.HealTargetDatabase.ContainsKey(name) || this.HealHeroDatabase.ContainsKey(name) || this.HealAllDatabase.ContainsKey(name)))
                        {
                            int beasts = 0;
                            foreach (Minion mm in p.ownMinions)
                            {
                                if (mm.Ready && mm.handcard.card.name == CardDB.cardName.lightwarden) beasts++;
                            }
                            if (beasts == 0) return 500;
                        }
                        else
                        {
                            //ignore that minion if it does not have charge, or we can give him charge ---> warsong was deleted ;_;
                            if (!(name == CardDB.cardName.nightblade || card.Charge || this.silenceDatabase.ContainsKey(name) || ((TAG_RACE)card.race == TAG_RACE.PET && p.ownMinions.Find(x => x.name == CardDB.cardName.tundrarhino) != null) || p.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null))
                            {
                                return 500;
                            }
                        }
                    }
                }
            }

            //lethal end########################################################
            //bonus for early thread
            
            if (p.ownMaxMana == 1 )
            {
                //if (card.name == CardDB.cardName.nerubianegg) return -10;
                //if (card.name == CardDB.cardName.lepergnome) return -2;
                //if (card.name == CardDB.cardName.faeriedragon) return -2;
                //if (card.name == CardDB.cardName.shrinkmeister) return 0;
                //if (card.name == CardDB.cardName.biggamehunter) return 20;
                //if (card.Attack >= 3 && card.Health >= 2) return 0;
                
            }



            /*if (card.name == CardDB.cardName.flamewaker && p.turnCounter == 0)
            {
                int number =0;
                foreach (Action a in p.playactions)
                {
                    if (a.card!=null && a.card.card.type == CardDB.cardtype.SPELL) number++;
                }
                return number * 10;
            }*/


            if (card.name == CardDB.cardName.unstableportal && p.owncards.Count <= 9) return -15;

            if (card.name == CardDB.cardName.daggermastery)
            {
                if (p.ownWeaponAttack >= 2 || p.ownWeaponDurability >= 2) return 5;
            }

            if (card.name == CardDB.cardName.upgrade)
            {
                if (p.ownWeaponDurability == 0)
                {
                    return 16;
                }
            }

            if (card.name == CardDB.cardName.baronrivendare)
            {
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.deathlord || mnn.name == CardDB.cardName.zombiechow || mnn.name == CardDB.cardName.dancingswords) return 30;
                }
            }

            //rule for coin on early game
            if (p.ownMaxMana < 3 && card.name == CardDB.cardName.thecoin) //1,2턴
            {
                bool WGON = false;
                int has1manacard = 0;
                int has2manacard = 0;
                int has3manacard = 0;
                bool hasweapon = false;
                bool hasPalSecret =false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.wildgrowth || hcc.card.name == CardDB.cardName.darnassusaspirant ) WGON = true;
                    if (hcc.manacost == 1 && hcc.card.type == CardDB.cardtype.MOB && hcc.card.name != CardDB.cardName.abusivesergeant) has1manacard++;
                    if (hcc.card.Secret && hcc.getManaCost(p) == 1) hasPalSecret = true;
                    if (hcc.manacost == 2 && hcc.card.type != CardDB.cardtype.HEROPWR && hcc.card.name != CardDB.cardName.ironbeakowl) has2manacard++;
                    if (hcc.manacost == 3 && hcc.card.name != CardDB.cardName.biggamehunter) has3manacard++;
                    //check 2 mana weapon situation
                    if (hcc.manacost == 2 && (hcc.card.type == CardDB.cardtype.WEAPON) && p.enemyMinions.Count >=1) hasweapon = true;
                }
                bool hassecretkepper = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.secretkeeper) hassecretkepper = true;
                }
                if (p.ownHeroName == HeroEnum.druid && WGON) return 0;
                if (has1manacard >= 2 && p.ownMaxMana == 1) return 0;
                if (has2manacard >= 2 && p.ownMaxMana == 1) return 0;
                if (has3manacard >= 2 && p.ownMaxMana == 2) return 0;
                if (has3manacard == 1 && has1manacard == 1 && has2manacard == 1 && p.ownMaxMana == 2) return 0;
                if (hasweapon) return 0;
                if (hasPalSecret && hassecretkepper) return 0;

               // if (!WGON || (has2manamob <= 1 && p.ownMaxMana == 1) || (has2manamob+has3manamob <= 1 && p.ownMaxMana == 2)) return 500;   //몹없고, 무기있고 적몹있는경우 아니거나, 급속성장 없으면 페널티.
                return 25;
            }


            if (card.name == CardDB.cardName.innervate)
            {
                if (p.mana >= 9) return 100;

            }


/*            //rule for coin on early game
            if (p.ownMaxMana < 3 && card.name == CardDB.cardName.thecoin)
            {
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.manacost <= p.ownMaxMana && hc.card.type == CardDB.cardtype.MOB) return 10;
                }

            }*/




            if (name == CardDB.cardName.flare)
            {
                if (p.enemyHeroName == HeroEnum.mage || p.enemyHeroName == HeroEnum.pala || p.enemyHeroName == HeroEnum.hunter)
                {
                    if (p.enemySecretCount >= 1 && p.playactions.Count == 0) return -10;
                    if (p.owncards.Count <=2) return 0;
                    return 15;
                }
                return 0;
                
            }

            //some effects, which are bad :D
            int pen = 0;
            if (!lethal && name == CardDB.cardName.houndmaster)
            {

                int beasts = 0;
                foreach (Minion mm in p.ownMinions)
                {
                    if (mm.Ready && (TAG_RACE)mm.handcard.card.race == TAG_RACE.PET) beasts++;
                }
                if (target != null && target.Ready && target.own && beasts >= 1) return -2;
                if (target == null) return 2;
                
            }

            if ((card.name == CardDB.cardName.biggamehunter) && (target == null || target.own))
            {
                return 100-6*p.ownMaxMana;
            }


            if (name == CardDB.cardName.sylvanaswindrunner && p.enemyMinions.Count == 0)
            {
                return 50;
            }

            if (name == CardDB.cardName.cabalshadowpriest && target == null)
            {
                return 40;
            }

            if (name == CardDB.cardName.emergencycoolant && target != null && target.own)//dont freeze own minions
            {
                pen = 500;
            }

            if (name == CardDB.cardName.shatteredsuncleric && target == null) { pen = 10; }
            if (name == CardDB.cardName.argentprotector)
            {
                if (target == null) { pen = 20; }
                else
                {
                    if (!target.own) { return 500; }
                    if (target.divineshild) { pen = 15; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion) { pen = 10; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion && target.Angr <= 2 && target.Hp <= 2) { pen = 15; }
                }

            }

            if (name == CardDB.cardName.facelessmanipulator)
            {
                if (target == null)
                {
                    return 50;
                }
                if (target.Angr >= 5 || target.handcard.card.cost >= 5 || (target.handcard.card.rarity == 5 || target.handcard.card.cost >= 3))
                {
                    return 0;
                }
                return 49;
            }

            if (name == CardDB.cardName.ancientofwar)
            {
                if (p.enemyMinions.Count > 0 && choice == 1) return 200;
            //    if (p.enemyMinions.Count == 0 && choice == 2) return 50;
            }

            if (name == CardDB.cardName.druidoftheflame)
            {

                if (p.enemyMinions.Count > 0 && choice == 2) return 40;
                if (p.enemyMinions.Count == 0 && choice == 1) return 40;

            }

            if (name == CardDB.cardName.gangup && target!=null)
            {
                if(target.handcard.card.isToken) return 20;
                if (target.handcard.card.isSpecialMinion) return -20;
                
                
            }

            if (name == CardDB.cardName.theblackknight)
            {
                if (target == null)
                {
                    return 50;
                }

                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.taunt && (target.Angr >= 3 || target.Hp >= 3)) return 0;
                }
                return 20;
            }

            //////////////////
            ///////////////////
            ////////////////////
            ///////////////////

            if (name == CardDB.cardName.ancientwatcher)
            {
                if (p.ownMaxMana <= 3)
                {
                    foreach (Handmanager.Handcard hc in p.owncards)
                    {
                        if (name == CardDB.cardName.ironbeakowl || p.owncards.Count >= 8)
                        {
                            return 0;
                        }
                    }
                    return 45;
                }
            }



            if (name == CardDB.cardName.drboom)
            {
                if (p.ownMinions.Count >= 5)
                {
                    return 50;
                }
            }

            if (name == CardDB.cardName.kezanmystic)
            {
                if (p.enemySecretCount >= 1) return -80;
                if (p.enemyHeroName == HeroEnum.hunter || p.enemyHeroName == HeroEnum.mage || p.enemyHeroName == HeroEnum.pala) //enemy hero has secret?
                {
                    return 55 - 2 * (p.ownMaxMana);
                }

            }


            if (name == CardDB.cardName.hellfire)
            {
                int PENALTY = 0;
                int ENEMYMINIONATTACK = 0;
                int ENEMYMINIONHPOVER4 = 0;
                foreach (Minion mnn in p.enemyMinions)
                {
                    ENEMYMINIONATTACK += mnn.Angr;
                    if (mnn.Hp >= 4)
                    {
                        ENEMYMINIONHPOVER4++;
                    }

                }

                if (p.enemyMinions.Count <= 2 && p.enemyHero.Hp >= 4)
                {
                    PENALTY += 30 * (3 - p.enemyMinions.Count); //penalty low count
                }

                return PENALTY;
            }

            

            if (name == CardDB.cardName.loatheb)
            {
                bool HEALON = false;
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if ((this.HealTargetDatabase.ContainsKey(name) || this.HealHeroDatabase.ContainsKey(name) || this.HealAllDatabase.ContainsKey(name)))
                    {
                        HEALON = true;
                    }
                }

                bool TAUNTON = false;
                foreach (Minion mn in p.ownMinions)
                {
                    if (mn.taunt)
                    {
                        TAUNTON = true;
                    }
                }

                if (p.ownMinions.Count == 0) return 0;
                if (p.enemyMinions.Count == 0 && p.ownHero.Hp >= 14 && p.ownMinions.Count <= 2)
                {
                    return 5;
                }
                if (!HEALON && p.ownHero.Hp <= 10 && !TAUNTON)
                {
                    return -15;
                }
            }


            if (name == CardDB.cardName.moltengiant)
            {
                int PENALTY = 0;
                int MOLTEN = 20;
                int MOUNTAIN = 12;
                bool ANOTHER4COST = false;
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (name == CardDB.cardName.moltengiant)
                    {
                        MOLTEN = hc.card.getManaCost(p, hc.manacost);
                        if (hc.card.getManaCost(p, hc.manacost) == 0)
                        {
                            PENALTY = -50;
                        }
                    }
                    if (name == CardDB.cardName.mountaingiant)
                    {
                        MOUNTAIN = hc.card.getManaCost(p, hc.manacost);
                    }
                    if (hc.card.getManaCost(p, hc.manacost) == 4) ANOTHER4COST = true;

                }

                if (MOLTEN == 4 && ANOTHER4COST)
                {
                    PENALTY = 25;
                }

                if (MOLTEN >= MOUNTAIN)
                {
                    PENALTY = 100;
                }
                return PENALTY;
            }


            if (name == CardDB.cardName.twilightdrake)
            {
                int DEMONCOUNT = 0;
                bool MOUNTAIN4COST = false;
                foreach (Handmanager.Handcard hc in p.owncards)
                {

                    if (name == CardDB.cardName.voidcaller)//use voidcaller first (if we have another demon)
                    {
                        foreach (Handmanager.Handcard hcc in p.owncards)
                        {
                            if ((TAG_RACE)hcc.card.race == TAG_RACE.DEMON)
                            {
                                DEMONCOUNT++;
                            }
                        }

                    }


                    if (name == CardDB.cardName.mountaingiant && hc.card.cost <= 4)
                    {
                        MOUNTAIN4COST = true;
                    }


                }
                if (DEMONCOUNT >= 2) return 40;
                if (MOUNTAIN4COST) return 40; //mountaingiant first
            }

            if (name == CardDB.cardName.voidcaller && p.ownMaxMana == 4)
            {
                int DEMONCOUNT = 0;
                bool COINON = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((TAG_RACE)hcc.card.race == TAG_RACE.DEMON)
                    {
                        DEMONCOUNT++;
                    }
                    if (hcc.card.name == CardDB.cardName.thecoin)
                    {
                        COINON = true;
                    }
                }
                if (COINON && DEMONCOUNT < 2) return 25;
            }



            if (name == CardDB.cardName.lordjaraxxus)
            {
                if ((p.ownMinions.Count - p.enemyMinions.Count) > 0 || p.ownHero.Hp <= 8)
                {
                    return 0;
                }

                return 150;
            }



            if (name == CardDB.cardName.acidicswampooze && (p.enemyHeroName == HeroEnum.warrior || p.enemyHeroName == HeroEnum.thief
                    || p.enemyHeroName == HeroEnum.pala || p.enemyHeroName == HeroEnum.shaman || p.enemyHeroName == HeroEnum.hunter))
            {
                if (p.enemyWeaponDurability >= 1)
                {
                    return 0;
                }
                return 40 - 4 * (p.ownMaxMana);
            }

            if (name == CardDB.cardName.harrisonjones && (p.enemyHeroName == HeroEnum.warrior || p.enemyHeroName == HeroEnum.thief
                    || p.enemyHeroName == HeroEnum.pala || p.enemyHeroName == HeroEnum.shaman || p.enemyHeroName == HeroEnum.hunter))
            {
                if (p.enemyWeaponDurability >= 1)
                {
                    return 0;
                }
                return 40 - 4 * (p.ownMaxMana);
            }

//heroability

            if (name == CardDB.cardName.steadyshot)
            {
                bool puremob = false;
                bool hassecret = false;
                int heropowermana = p.ownHeroAblility.getManaCost(p);
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((hcc.card.name == CardDB.cardName.explosivetrap && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.EX1_610))
                        || (hcc.card.name == CardDB.cardName.freezingtrap && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.EX1_611))
                        || (hcc.card.name == CardDB.cardName.snaketrap && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.EX1_554))
                        || (hcc.card.name == CardDB.cardName.snipe && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.EX1_609))
                        || (hcc.card.name == CardDB.cardName.misdirection && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.EX1_533))
                        || (hcc.card.name == CardDB.cardName.beartrap && !p.ownSecretsIDList.Contains(CardDB.cardIDEnum.AT_060))) hassecret = true;
                    if (hcc.manacost <= p.mana && hcc.card.name != CardDB.cardName.ironbeakowl && (hcc.card.type == CardDB.cardtype.MOB || hcc.card.name == CardDB.cardName.animalcompanion)) puremob = true; // check available minion
                }
                if (p.enemyHero.Hp <= 2) return 0;
                if (p.manaTurnEnd >= 2 && heropowermana <=2) return 0;
                if (puremob) return 2;
                if (hassecret) return 2;
                return 0;
            }

            if (name == CardDB.cardName.lesserheal)
            {
                bool puremob = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.manacost <= p.mana && !this.BadEarlyturnMinionsDatabase.ContainsKey(hcc.card.name) && (hcc.card.type == CardDB.cardtype.MOB || hcc.card.name == CardDB.cardName.animalcompanion)) puremob = true;
                }
                bool haswounded = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.wounded) haswounded = true;
                }
                if (!haswounded && puremob) return 5;
                return 0;
            }


//

            if (name == CardDB.cardName.eaglehornbow)
            {
                if (p.ownSecretsIDList.Count >= 1 && p.enemyMinions.Count >= 1) return 0;
                if (p.ownSecretsIDList.Count == 0 && p.enemyMinions.Count == 0) return 3;

            }


            if (name == CardDB.cardName.freezingtrap)
            {
                int hasmob = 0;
                int hasowl = 0;
                bool puremob = false;
                bool haseaglehorn = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.eaglehornbow) haseaglehorn = true;
                    if (hcc.card.name == CardDB.cardName.ironbeakowl) hasowl++;
                    if (hcc.manacost <= p.ownMaxMana && (hcc.card.type == CardDB.cardtype.MOB || hcc.card.name == CardDB.cardName.animalcompanion)) hasmob++; // check minion
                }
                if ((hasowl == 1 && hasmob - hasowl >= 0) || (hasowl == 2 && hasmob - hasowl + 1 >= 0)) puremob = true;

                bool enemyhasmob = false;
                foreach (Minion mn in p.enemyMinions)
                {
                    if (mn.name == CardDB.cardName.antiquehealbot) return 150; //to avoid enemy use healot again
                    enemyhasmob = true;
                }

                // if we have eaglehorn, can use this.

                if (!puremob && !enemyhasmob && haseaglehorn) return 0;

                //can use this secret
                if ((p.ownWeaponDurability >= 1 && p.ownWeaponName == CardDB.cardName.eaglehornbow) || p.ownHero.Hp <= 10 || (p.enemyMinions.Count <= 1 && p.ownMaxMana >= 5) || (!puremob && p.ownMaxMana >= 3)) return 0;

                return 5;
            }

            if (name == CardDB.cardName.snaketrap) // to avoid use this early turn
            {
                if (p.enemyWeaponName == CardDB.cardName.deathsbite && p.enemyWeaponDurability == 1) return 500;
                
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.knifejuggler) return -3;
                }
                if (p.ownMaxMana <= 2) return 15;
                return 0;
            }

            if (name == CardDB.cardName.beartrap) 
            {
                //if (p.ownMaxMana <= 2) return 50;
                int puremob = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.getManaCost(p) <= p.ownMaxMana && (hcc.card.type == CardDB.cardtype.MOB || hcc.card.name == CardDB.cardName.animalcompanion) && hcc.card.name != CardDB.cardName.ironbeakowl) puremob++; //
                }
                if (puremob >= 1 && p.ownHero.Hp >=10) return 15;
            }


            if (name == CardDB.cardName.explosivetrap) // to avoid early turn
            {

                int hasmob = 0;
                int hasowl = 0;
                bool puremob = false;
                bool haseaglehorn = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.eaglehornbow) haseaglehorn = true;
                    if (hcc.card.name == CardDB.cardName.ironbeakowl) hasowl++;
                    if (hcc.manacost <= p.ownMaxMana && (hcc.card.type == CardDB.cardtype.MOB || hcc.card.name == CardDB.cardName.animalcompanion)) hasmob++; 
                }
                if ((hasowl == 1 && hasmob - hasowl >= 0) || (hasowl == 2 && hasmob - hasowl + 1 >= 0)) puremob = true;

                int enemyhasmob = 0;
                foreach (Minion mn in p.enemyMinions)
                {
                    if (mn.Hp <= 2 && !mn.divineshild) enemyhasmob++;

                }
                if ((p.ownWeaponDurability >= 1 && p.ownWeaponName == CardDB.cardName.eaglehornbow) || p.ownHero.Hp <= 10 || (!puremob && p.ownMaxMana >= 3)) return 0;
                if (p.turnCounter <= 2) return 5; 
                if ((enemyhasmob <= 2 && p.enemyMinions.Count <= 2) || puremob || !haseaglehorn) return 10; 
                return 0;
            }







            if (name == CardDB.cardName.keeperofthegrove)
            {
                if (p.enemyMinions.Count == 0) return 20;
            }

            
            
            if (name == CardDB.cardName.repentance)
            {
                bool canuse = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.repentance && p.manaTurnEnd >= hcc.getManaCost(p)) canuse = true;
                }
                if (canuse && p.ownMaxMana >= 3) return 0;
                return 10;
            }

            if (name == CardDB.cardName.noblesacrifice)
            {
                bool canuse = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.noblesacrifice && p.manaTurnEnd >= hcc.getManaCost(p)) canuse = true;
                }
                if (canuse) return -4;
                return 0;
            }

            if (name == CardDB.cardName.avenge)
            {
                bool canuse = false;
                foreach(Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.card.name == CardDB.cardName.avenge && p.manaTurnEnd >= hcc.getManaCost(p)) canuse = true;
                }
                if (canuse) return -1;
                return 0;
            }
            


            if (name == CardDB.cardName.warhorsetrainer)
            {
                bool musteron = false;
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.card.name == CardDB.cardName.musterforbattle) musteron = true;
                }

                int silver =0;
                foreach (Minion mn in p.ownMinions)
                {
                    if (mn.name == CardDB.cardName.silverhandrecruit) silver++;
                }
                //no use if we have no silverhand
                if (p.ownMaxMana <= 3 && (musteron || silver == 0)) return 5; 
            }


            if (name == CardDB.cardName.quartermaster && p.ownHeroName == HeroEnum.pala)
            {
                int silver = 0;
                int silverReady = 0;
                foreach (Minion mn in p.ownMinions)
                {
                    if (mn.name == CardDB.cardName.silverhandrecruit)
                    {
                        if (mn.Ready) silverReady++;
                        silver++;
                    }
                }
                if (silverReady >= 1 || silver >= 2) return 0;
                return 10;
            }



////////////////////dragon

            if (name == CardDB.cardName.twilightwhelp)
            {
                int DRAGONCOUNT = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((TAG_RACE)hcc.card.race == TAG_RACE.DRAGON)
                    {
                        DRAGONCOUNT++;
                    }
                }
                if (DRAGONCOUNT <= 1) return 5;
            }

            if (name == CardDB.cardName.twilightguardian)
            {
                int DRAGONCOUNT = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((TAG_RACE)hcc.card.race == TAG_RACE.DRAGON)
                    {
                        DRAGONCOUNT++;
                    }
                }
                if (DRAGONCOUNT <= 1) return 3;
            }




            if (name == CardDB.cardName.wyrmrestagent || name == CardDB.cardName.blackwingtechnician)
            {
                int DRAGONCOUNT = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((TAG_RACE)hcc.card.race == TAG_RACE.DRAGON)
                    {
                        DRAGONCOUNT++;
                    }
                }
                if (DRAGONCOUNT <= 0) return 5;
            }


            if (name == CardDB.cardName.confessorpaletress)
            {
                if (p.enemyMinions.Count == 0) return 0;
                if (p.ownMaxMana <= 8) return 25;
            }


            
            if (name == CardDB.cardName.blackwingcorruptor)
            {
                if (p.enemyMinions.Count == 0) return 15;
            }

            if (name == CardDB.cardName.rockbiterweapon)
            {
                if (p.enemyMinions.Count == 0) return 100;
            }


            if (name == CardDB.cardName.ramwrangler)
            {
                bool hasbeast = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if ((TAG_RACE)mnn.handcard.card.race == TAG_RACE.PET) hasbeast = true;
                }
                if (!hasbeast) return 30;
            }


            if (name == CardDB.cardName.manatidetotem)
            {
                bool taunton = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.taunt) taunton = true;
                }

                int enemyDMG = 0;
                foreach (Minion mnn in p.enemyMinions)
                {
                    enemyDMG += mnn.Angr;
                }
                bool candie = false;
                if ((p.enemyHeroName == HeroEnum.mage || p.enemyHeroName == HeroEnum.thief) && enemyDMG >= 2) candie = true;
                if (enemyDMG >= 3) candie = true;


                if (!taunton && candie) return 30;
            }


            if (name == CardDB.cardName.emperorthaurissan)
            {
                return 0 - p.owncards.Count;
            }

            //////////////secret paladin
            if (name == CardDB.cardName.competitivespirit)
            {
                if (p.ownMinions.Count >= 2) return 0;
                return 5;
            }






            //------------------------------------------------------------------------------------------------------
            Minion m = target;

            if (card.name == CardDB.cardName.reincarnate)
            {
                if (m.own)
                {
                    if (m.handcard.card.deathrattle || m.ancestralspirit >= 1 || m.souloftheforest >= 1 || m.enemyBlessingOfWisdom >= 1) return 0;
                    if (m.handcard.card.Charge && ((m.numAttacksThisTurn == 1 && !m.windfury) || (m.numAttacksThisTurn == 2 && m.windfury))) return 0;
                    if (m.wounded || m.Angr < m.handcard.card.Attack || (m.silenced && PenalityManager.instance.specialMinions.ContainsKey(m.name))) return 0;


                    bool hasOnMinionDiesMinion = false;
                    foreach (Minion mnn in p.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.scavenginghyena && m.handcard.card.race == TAG_RACE.PET) hasOnMinionDiesMinion = true;
                        if (mnn.name == CardDB.cardName.flesheatingghoul || mnn.name == CardDB.cardName.cultmaster) hasOnMinionDiesMinion = true;
                    }
                    if (hasOnMinionDiesMinion) return 0;

                    return 500;
                }
                else
                {
                    if (m.name == CardDB.cardName.nerubianegg && m.Angr <= 4 && !m.taunt) return 500;
                    if (m.taunt && !m.handcard.card.tank) return 0;
                    if (m.enemyBlessingOfWisdom >= 1) return 0;
                    if (m.Angr > m.handcard.card.Attack || m.Hp > m.handcard.card.Health) return 0;
                    if (m.name == CardDB.cardName.abomination || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.unstableghoul || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;

                }

            }

            if (name == CardDB.cardName.madbomber || name == CardDB.cardName.madderbomber)
            {
                 //penalize for any own minions with health equal to potential attack amount
                 //to lessen risk of losing your own minion

                 int maxAtk = 3;

                if (name == CardDB.cardName.madderbomber) maxAtk = 6;
                if (maxAtk >= p.ownHero.Hp && maxAtk < p.enemyHero.Hp) return 500;//we could be killed, but not enemy >_< .. otherwise YOLO
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.Hp <= maxAtk)
                    {
                        if (mnn.Ready) pen += 20; 
                    }
                }

                /*
                int numTargets = 2 + p.ownMinions.Count + p.enemyMinions.Count;
                int numOwnTargets = 1 + p.ownMinions.Count;
                int numEnemyTargets = numTargets-numOwnTargets;
                double dmgpertarget = ((double)maxAtk)/((double)numTargets);
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.Hp <= dmgpertarget)
                    {
                        pen += 10;
                    }
                }
                */
            }


            if (name == CardDB.cardName.goblinblastmage)
            {
                bool mechOnField = false;

                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.handcard.card.race == TAG_RACE.MECHANICAL)
                    {
                        mechOnField = true;
                        break;
                    }
                }

                if (! mechOnField)
                {
                    int manacost = card.getManaCost(p, manaCostCard);
                    foreach (Handmanager.Handcard hc in p.owncards)
                    {
                        if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= (hc.getManaCost(p) + manacost)) return 500;//hc.card.race Should work? Nohero please confirm!
                        if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= hc.getManaCost(p)) return 50;

                    }
                }
                else
                {
                    return 20;
                }
            }
            
            if (card.name == CardDB.cardName.knifejuggler)
            {
                int hasmob = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.manacost == 2 && (hcc.card.type == CardDB.cardtype.MOB && hcc.card.name != CardDB.cardName.ironbeakowl && hcc.card.name != CardDB.cardName.knifejuggler)) hasmob++;
                }
                /*if (Ai.Instance.botBase is BehaviorMidPaladin)
                {
                    foreach (Minion mnn in p.ownMinions)
                    {
                        if (mnn.Angr >=2 && mnn.Hp == 1 && p.ownMaxMana <=2) return 20;
                    }
                }*/
                
                if (p.ownMaxMana <= 3 && hasmob >= 1) return 100;
                if (p.mobsplayedThisTurn >= 1 || ((p.ownHeroName == HeroEnum.pala || p.ownHeroName == HeroEnum.shaman) && p.ownAbilityReady == false)) return 5;
            }

            if (card.name == CardDB.cardName.flametonguetotem)
            {
                int readycount = 0;
                
                if(p.ownMinions.Count == 0) return 100;

                foreach(Minion mnn in p.ownMinions)
                {
                    //only ready
                    if (mnn.Ready && !mnn.exhausted) readycount++;
                }
                if (readycount == 0) return 15;
                if (readycount >= 1) return 0;
            }

            if (card.name == CardDB.cardName.stampedingkodo)
            {
                bool found = false;
                foreach (Minion mi in p.enemyMinions)
                {
                    if (mi.Angr <= 2) found = true;
                }
                if (!found) return 5;
            }

            if (name == CardDB.cardName.windfury)
            {
                if (!m.own) return 500;
                if (m.own && !m.Ready) return 500;
            }



            if ((name == CardDB.cardName.wildgrowth || name == CardDB.cardName.nourish && choice != 2))
            {
                if (p.ownMaxMana >= 7 && p.ownMaxMana <= 9 && !(p.ownHeroName == HeroEnum.thief && p.cardsPlayedThisTurn == 0)) return 500;
                if (name == CardDB.cardName.wildgrowth)
                {
                    foreach(Handmanager.Handcard hcc in p.owncards)
                    {
                        if (hcc.card.name == CardDB.cardName.darnassusaspirant && hcc.getManaCost(p) <= 2) return 10;
                    }
                }
            }

            if (name == CardDB.cardName.ancestralspirit)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.name == CardDB.cardName.deathlord || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;
                }
                if (target.own && !target.isHero)
                {
                    if (this.specialMinions.ContainsKey(m.name)) return -5;
                    return 0;
                }

            }

            if (name == CardDB.cardName.sylvanaswindrunner)
            {
                if (p.enemyMinions.Count == 0)
                {
                    return 10;
                }
            }

            if (name == CardDB.cardName.betrayal && !target.own && !target.isHero)
            {
                if (m.Angr == 0) return 30;
                if (p.enemyMinions.Count == 1) return 30;
            }




            if (name == CardDB.cardName.bite)
            {
                if ((p.ownHero.numAttacksThisTurn == 0 || (p.ownHero.windfury && p.ownHero.numAttacksThisTurn == 1)) && !p.ownHero.frozen)
                {

                }
                else
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.deadlypoison)
            {
                return -p.ownWeaponDurability * 2;
            }

            if (name == CardDB.cardName.shadydealer)
            {
                bool haspirate = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.handcard.card.race == TAG_RACE.PIRATE)
                    {
                        haspirate = true;
                        break;
                    }
                }
                if (haspirate) return 0;
                else return 10;
            }

            if (name == CardDB.cardName.coldblood)
            {
                if (lethal) return 0;
                return 25;
            }

            if (name == CardDB.cardName.bloodmagethalnos)
            {
                return 10;
            }

            if (name == CardDB.cardName.frostbolt)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.handcard.card.cost <= 2)
                        return 15;
                }
                return 8;
            }

            if (!lethal && choice == 1 && name == CardDB.cardName.druidoftheclaw)
            {
                return 20;
            }

            if (name == CardDB.cardName.swipe)
            {
                int targets = 0;
                bool targetexist = false;
                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.Hp <= 1 + p.spellpower || mnn.divineshild) targets++;
                    if (mnn.Hp > 1 + p.spellpower && !mnn.divineshild) targetexist = true;
                }
                if (target.isHero && !target.own && targets >= 2 && !targetexist) return -10 * targets;
                return 0;
                


            }


            if (name == CardDB.cardName.poweroverwhelming)
            {
                if (target.own && !target.isHero && !m.Ready)
                {
                    return 500;
                }
            }

            if (name == CardDB.cardName.frothingberserker)
            {
                if (p.cardsPlayedThisTurn >= 1) pen = 5;
            }

            if (name == CardDB.cardName.handofprotection)
            {
                if (m.Hp == 1) pen = 15;
            }

            if (lethal)
            {
                if (name == CardDB.cardName.corruption)
                {
                    int beasts = 0;
                    foreach (Minion mm in p.ownMinions)
                    {
                        if (mm.Ready && (mm.handcard.card.name == CardDB.cardName.questingadventurer || mm.handcard.card.name == CardDB.cardName.archmageantonidas || mm.handcard.card.name == CardDB.cardName.manaaddict || mm.handcard.card.name == CardDB.cardName.manawyrm || mm.handcard.card.name == CardDB.cardName.wildpyromancer)) beasts++;
                    }
                    if (beasts == 0) return 500;
                }
            }

            if (name == CardDB.cardName.divinespirit)
            {
                if (lethal)
                {
                    if (!target.own && !target.isHero)
                    {
                        if (!m.taunt)
                        {
                            return 500;
                        }
                        else
                        {
                            // combo for killing with innerfire and biggamehunter
                            if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && (m.Hp >= 4 || (p.owncards.Find(x => x.card.name == CardDB.cardName.divinespirit) != null && m.Hp >= 2)))
                            {
                                return 0;
                            }
                            return 500;
                        }
                    }
                }
                else
                {
                    if (!target.own && !target.isHero)
                    {

                        // combo for killing with innerfire and biggamehunter
                        if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && m.Hp >= 4)
                        {
                            return 0;
                        }
                        return 500;
                    }

                }

                if (target.own && !target.isHero)
                {

                    if (m.Hp >= 4)
                    {
                        return 0;
                    }
                    return 15;
                }

            }





            if ((name == CardDB.cardName.polymorph || name == CardDB.cardName.hex))
            {



                if (target.own && !target.isHero)
                {
                    return 500;
                }

                if (!target.own && !target.isHero)
                {
                    if (target.allreadyAttacked) return 30;
                    Minion frog = target;
                    if (this.priorityTargets.ContainsKey(frog.name)) return 0;
                    if (frog.Angr >= 4 && frog.Hp >= 4) return 0;
                    return 30;
                }

            }
            //////////////
            ///////////////
            if (name == CardDB.cardName.sunfuryprotector)
            {
                if (Ai.Instance.botBase is BehaviorHandlock)
                {
                    if (p.ownHero.Hp <= 10) return 0;
                    int NEEDTAUNTCOUNT = 0;
                    foreach (Minion min in p.ownMinions)
                    {
                        if (!min.taunt && min.Hp >=4)
                        {
                            NEEDTAUNTCOUNT++;
                        }
                    }
                    if (p.ownHero.Hp <= 14 && NEEDTAUNTCOUNT >= 2) return -5;
                    if (NEEDTAUNTCOUNT >= 2) return 0;
                    if (NEEDTAUNTCOUNT == 1 && p.ownHero.Hp <=16) return 10;
                    return 500;
                }
                int TAUNTCOUNT = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.taunt)
                    {
                        TAUNTCOUNT++;
                    }
                }
                if (p.ownHero.Hp <= 14 && TAUNTCOUNT <= 1 && p.ownMinions.Count >= 1)
                {
                    return 0;
                }
                if (p.ownHero.Hp <= 8)
                {
                    return 0;
                }
                return 40 - 3 * (p.ownMaxMana);
            }

            if (name == CardDB.cardName.defenderofargus && p.ownMinions.Count <= 1)
            {
                if (p.ownHero.Hp <= 10) return 0;
                return (2 - p.ownMinions.Count) * 40; 
            }
            //////////////

            if (name == CardDB.cardName.shrinkmeister) //shrinkmeister
            {
                bool puremob = false;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if (hcc.manacost <= p.mana && !this.BadEarlyturnMinionsDatabase.ContainsKey(hcc.card.name) && hcc.card.type == CardDB.cardtype.MOB ) puremob = true;
                }
                if (p.enemyMinions.Count == 0 && (puremob && p.ownMaxMana <=5)) return 100;

                return 0;                
            }
            //////////////
            if (name == CardDB.cardName.unleashthehounds)
            {
                bool hasjuggler = false;
                bool haskillcommand = false;

                foreach (Minion mnn in p.ownMinions)
                {
                    if (name == CardDB.cardName.knifejuggler)
                    {
                        hasjuggler = true;
                    }
                }

                foreach (Handmanager.Handcard hcc in p.owncards)
                {

                    if (name == CardDB.cardName.killcommand && p.mana >= 6)
                    {
                        haskillcommand = true;
                    }
                }

                bool targeton = false;
                bool sonnim = false;
                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.Hp >= 4) targeton = true;
                    if (mnn.name == CardDB.cardName.grimpatron && mnn.Hp >= 2) sonnim = true;
                }
                if (sonnim) return 100 - 5 * (p.enemyMinions.Count);
                if (hasjuggler || (haskillcommand && targeton) || p.ownHero.Hp <= 10) return 0;
                if (p.enemyMinions.Count <= 3 || (!hasjuggler || !haskillcommand)) return 40 - 5 * (p.enemyMinions.Count);


            }

            if (name == CardDB.cardName.killcommand)
            {
                bool hasbeast = false;
                foreach (Minion mnn in p.ownMinions)
                {
                    if ((TAG_RACE)mnn.handcard.card.race == TAG_RACE.PET) hasbeast = true;
                }
                if (hasbeast && p.enemyHero.Hp <= 12 && target.isHero) return 3;  //
                if (hasbeast && target.Hp - p.spellpower == 5 && !target.isHero) return 3;
                if (target.Angr >= 5 && !target.isHero && !target.own) return 3;
                if (!hasbeast && (p.ownHero.Hp >= 10 || p.enemyHero.Hp + p.enemyHero.armor >= 13)) return 100; //
                if (!target.isHero && target.Hp -p.spellpower >= 6) return 300; //
                if (!target.isHero && target.Hp <= 2 && target.Angr <= 5) return 100;
                
                return 50;

            }

            if (name == CardDB.cardName.quickshot)
            {
                int PENALTY = 0;
                if (m.Angr <= 3) PENALTY += 5;
                if (m.Hp >= 4) PENALTY += 45;
                if (!p.ownHero.allreadyAttacked && p.ownHero.Hp >= 10 && p.ownWeaponDurability >= 1) PENALTY += 20;
                //if (!target.isHero) PENALTY += 3; 
                if (target.isHero && p.enemyHero.Hp + p.enemyHero.armor <= 6) PENALTY = 0;
                if (p.ownHero.Hp <= 10) PENALTY -= 20;
                if (target.isHero && !target.own && target.Hp <= 8) PENALTY -= 45;
                if (p.owncards.Count == 1) PENALTY = -500;

                return PENALTY;
            }






            if (name == CardDB.cardName.mindcontroltech)
            {
                if (p.enemyMinions.Count <= 3) return 5;
                if (p.enemyMinions.Count >= 4) return -15;
            }



            if (name == CardDB.cardName.voljin)
            {
                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.Hp >= 5) return 0;
                }

                return 50;
            }

            if (name == CardDB.cardName.cabalshadowpriest)
            {
                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.Angr <= 2) return 0;
                }

                return 5;
            }


            if (name == CardDB.cardName.rendblackhand)
            {
                int DRAGONCOUNT = 0;
                foreach (Handmanager.Handcard hcc in p.owncards)
                {
                    if ((TAG_RACE)hcc.card.race == TAG_RACE.DRAGON)
                    {
                        DRAGONCOUNT++;
                    }
                }
                if (target == null && DRAGONCOUNT >= 0)
                {
                    return 30;
                }
                if (DRAGONCOUNT == 0) return 0;

            }


////////////
///////////////

            if (name == CardDB.cardName.equality) // aoe penality
            {
                int hpdestroyed = 0;
                bool haspriority = false;
                foreach (Minion mini in p.enemyMinions)
                {
                    hpdestroyed += (mini.Hp - 1);
                    if (priorityTargets.ContainsKey(mini.name)) haspriority = true;
                }
                if (haspriority) return 5;
                if (p.enemyMinions.Count <= 2 || hpdestroyed <= 4)
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.bloodsailraider && p.ownWeaponDurability == 0)
            {
                //if you have bloodsailraider and no weapon equiped, but own a weapon:
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.card.type == CardDB.cardtype.WEAPON) return 10;
                }
            }



            if (name == CardDB.cardName.innerfire)
            {
                if (m.name == CardDB.cardName.lightspawn) pen = 500;
            }

            if (name == CardDB.cardName.huntersmark)
            {
                if (target.own && !target.isHero) return 500; // dont use on own minions
                if (!target.own && !target.isHero && ((target.Hp <= 4 && target.Angr <= 4) || !target.taunt)) // only use on strong minions
                {
                    pen = 50;
                    if (target.Angr >= 5) pen = 10 - target.Angr;
                    if (target.Hp >= 5) pen = 10 - target.Hp;
                }
                if (priorityTargets.ContainsKey(target.name) && target.Hp >=4  && !target.silenced && !target.own && !target.isHero)
                {
                    pen = -1;
                }
                return pen;
            }


            if ((name == CardDB.cardName.aldorpeacekeeper || name == CardDB.cardName.humility))
            {
                pen = 0;
                if (target != null)
                {
                    if (target.own) pen = 500; // dont use on own minions
                    if (!target.own && target.Angr <= 2) // only use on strong minions
                    {
                        pen = 20;
                    }
                    if (!target.own && target.Angr == 0) pen = 500;
                    foreach(Minion mnn in p.ownMinions)
                    {
                        if (mnn.allreadyAttacked) pen +=5;
                    }                   
                }
                else
                {
                    pen = 15;
                }
                if (p.ownWeaponAttack >= 1 && !p.ownHero.Ready && !p.ownHero.frozen) pen += 15;
                return pen;
            }



            if (name == CardDB.cardName.defiasringleader && p.cardsPlayedThisTurn == 0)
            { pen = 10; }
            if (name == CardDB.cardName.bloodknight)
            {
                int shilds = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                foreach (Minion min in p.enemyMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                if (shilds == 0)
                {
                    pen = 5;
                }
                if (shilds >= 1) pen -= shilds;
            }
            if (name == CardDB.cardName.direwolfalpha)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                { pen = 5; }
            }
            if (name == CardDB.cardName.abusivesergeant)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                {
                    pen = 5;
                }
            }

            if (p.turnCounter >= 1 && name == CardDB.cardName.reversingswitch && target.Angr == target.Hp) return 500;

            

            return pen;
        }
Beispiel #3
0
        public void playCard(CardDB.Card c, int cardpos, int cardEntity, int target, int targetEntity, int choice, int placepos)
        {
            // lock at frostnova (click) / frostblitz (no click)
            this.mana = this.mana - c.getManaCost(this);

            if (c.Secret)
            {
                this.ownSecretsIDList.Add(c.CardID);
                this.playedmagierinderkirintor = false;
            }
            if (c.type == CardDB.cardtype.SPELL) this.playedPreparation = false;


            if (logging) help.logg("play crd" + c.name + " " + cardEntity + " " + c.getManaCost(this) + " trgt " + target);

            if (c.type == CardDB.cardtype.MOB)
            {
                Action b = this.placeAmobSomewhere(c, cardpos, target, choice,placepos);
                b.druidchoice = choice;
                b.owntarget = placepos;
                b.enemyEntitiy = targetEntity;
                b.cardEntitiy = cardEntity;
                this.playactions.Add(b);
                this.mobsplayedThisTurn++;
                if (c.name == "magierinderkirintor") this.playedmagierinderkirintor = true;

            }
            else
            {
                Action a = new Action();
                a.cardplay = true;
                a.card = c;
                a.cardEntitiy = cardEntity;
                a.numEnemysBeforePlayed = this.enemyMinions.Count;

                a.owntarget = 0;
                if (target >= 0)
                {
                    a.owntarget = -1;
                }
                a.enemytarget = target;
                a.enemyEntitiy = targetEntity;
                a.druidchoice = choice;

                if (target == -1)
                {
                    //card with no target
                    if (c.type == CardDB.cardtype.WEAPON)
                    {
                        equipWeapon(c);
                    }
                    playCardWithoutTarget(c, choice);
                }
                else //before : if(target >=0 && target < 20)
                {
                    if (c.type == CardDB.cardtype.WEAPON)
                    {
                        equipWeapon(c);
                    }
                    playCardWithTarget(c, target, choice);
                }

                this.playactions.Add(a);

                if (c.type == CardDB.cardtype.SPELL)
                {
                    this.triggerPlayedASpell(c);
                }
            }

            triggerACardGetPlayed(c);

            removeCard(cardpos);// remove card



            this.ueberladung += c.recallValue;

            this.cardsPlayedThisTurn++;

        }
Beispiel #4
0
        private int getSpecialCardComboPenalitys(CardDB.Card card, Minion target, Playfield p, bool lethal, int choice)
        {
            CardDB.cardName name = card.name;

            if (lethal && card.type == CardDB.cardtype.MOB)
            {
                if (this.lethalHelpers.ContainsKey(name))
                {
                    return 0;
                }

                if (this.DamageTargetDatabase.ContainsKey(name) || this.DamageAllDatabase.ContainsKey(name) )
                {
                    return 0;
                }

                if (this.buffingMinionsDatabase.ContainsKey(name))
                {
                    if (name == CardDB.cardName.timberwolf || name == CardDB.cardName.houndmaster)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if ((TAG_RACE)mm.handcard.card.race == TAG_RACE.PET) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    if (name == CardDB.cardName.southseacaptain)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if ((TAG_RACE)mm.handcard.card.race == TAG_RACE.PIRATE) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    if (name == CardDB.cardName.murlocwarleader || name == CardDB.cardName.grimscaleoracle || name == CardDB.cardName.coldlightseer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if ((TAG_RACE)mm.handcard.card.race == TAG_RACE.MURLOC) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }

                    if (name == CardDB.cardName.warhorsetrainer)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.ownMinions)
                        {
                            if (mm.name == CardDB.cardName.silverhandrecruit) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                }
                else
                {
                    if (name == CardDB.cardName.theblackknight)
                    {
                        int beasts = 0;
                        foreach (Minion mm in p.enemyMinions)
                        {
                            if (mm.taunt) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                    else
                    {
                        if ((this.HealTargetDatabase.ContainsKey(name) || this.HealHeroDatabase.ContainsKey(name) || this.HealAllDatabase.ContainsKey(name)))
                        {
                            int beasts = 0;
                            foreach (Minion mm in p.ownMinions)
                            {
                                if (mm.Ready && mm.handcard.card.name == CardDB.cardName.lightwarden) beasts++;
                            }
                            if (beasts == 0) return 500;
                        }
                        else
                        {
                            if (!(name == CardDB.cardName.nightblade || card.Charge || this.silenceDatabase.ContainsKey(name) || ((TAG_RACE)card.race == TAG_RACE.PET && p.ownMinions.Find(x => x.name == CardDB.cardName.tundrarhino) != null) || (p.ownMinions.Find(x => x.name == CardDB.cardName.warsongcommander) != null && card.Attack <= 3) || p.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null))
                            {
                                return 500;
                            }
                        }
                    }
                }
            }

            //lethal end########################################################
            
            //Encourage shaman to play his ability, before playing damaging spell, for chance of getting +1 dmg from wind totem
            if (!lethal && p.ownAbilityReady == true && p.ownHeroName == HeroEnum.shaman)
            {
                if (this.DamageAllDatabase.ContainsKey(name) || 
                    this.DamageAllEnemysDatabase.ContainsKey(name) ||
                    this.DamageRandomDatabase.ContainsKey(name) ||
                    this.DamageTargetSpecialDatabase.ContainsKey(name) ||
                    this.DamageTargetDatabase.ContainsKey(name)) return 10;
            }

            if (p.ownMaxMana == 1 )
            {
                if (card.name == CardDB.cardName.lepergnome) return -10;
                if (card.name == CardDB.cardName.faeriedragon) return -20;
                if (card.Attack >= 3 && card.Health >= 2) return -20;
                
            }

            if (card.name == CardDB.cardName.unstableportal && p.owncards.Count <= 9) return -15;

            if (card.name == CardDB.cardName.daggermastery)
            {
                if (p.ownWeaponAttack >= 2 || p.ownWeaponDurability >= 2) return 5;
            }

            if (card.name == CardDB.cardName.upgrade)
            {
                if (p.ownWeaponDurability == 0)
                {
                    return 16;
                }
            }

            if (card.name == CardDB.cardName.baronrivendare)
            {
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.deathlord || mnn.name == CardDB.cardName.zombiechow || mnn.name == CardDB.cardName.dancingswords) return 30;
                }
            }

            //rule for coin on early game
            if (p.ownMaxMana < 3 && card.name == CardDB.cardName.thecoin)
            {
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.manacost <= p.ownMaxMana && hc.card.type == CardDB.cardtype.MOB) return 5;
                }

            }

            if (name == CardDB.cardName.flare && p.enemySecretCount >= 1 && p.playactions.Count == 0)
            {
                return -10;
            }

            //some effects, which are bad :D
            int pen = 0;

            //Play inspire cards first, and then use hero ability if possible
            if (card.hasInspire)
            {
                if (!p.ownAbilityReady) pen += 10;
            }

            if (name == CardDB.cardName.houndmaster)
            {
                if (target == null) return 50;
            }

            if ((card.name == CardDB.cardName.biggamehunter) && (target == null || target.own))
            {
                return 40;
            }
            if (name == CardDB.cardName.aldorpeacekeeper && target == null)
            {
                pen = 30;
            }

            if (name == CardDB.cardName.emergencycoolant && target != null && target.own)//dont freeze own minions
            {
                pen = 500;
            }

            if (name == CardDB.cardName.shatteredsuncleric && target == null) { pen = 10; }
            if (name == CardDB.cardName.argentprotector)
            {
                if (target == null) { pen = 20; }
                else
                {
                    if (!target.own) { return 500; }
                    if (target.divineshild) { pen = 15; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion) { pen = 10; }
                    if (!target.Ready && !target.handcard.card.isSpecialMinion && target.Angr <= 2 && target.Hp <= 2) { pen = 15; }
                }

            }

            if (name == CardDB.cardName.facelessmanipulator)
            {
                if (target == null)
                {
                    return 50;
                }
                if (target.Angr >= 5 || target.handcard.card.cost >= 5 || (target.handcard.card.rarity == 5 || target.handcard.card.cost >= 3))
                {
                    return 0;
                }
                return 49;
            }

            if (name == CardDB.cardName.ancientofwar)
            {
                if (p.enemyMinions.Count > 0 && choice == 1) return 200;
                if (p.enemyMinions.Count == 0 && choice == 2) return 50;
            }

            if (name == CardDB.cardName.druidoftheflame)
            {
                if (p.enemyMinions.Count > 0 && choice == 1) return 40;
                if (p.enemyMinions.Count == 0 && choice == 2) return 40;
            }

            if (name == CardDB.cardName.gangup && target!=null)
            {
                if(target.handcard.card.isToken) return 20;
                if (target.handcard.card.isSpecialMinion) return -20;
                
                
            }

            if (name == CardDB.cardName.theblackknight)
            {
                if (target == null)
                {
                    return 50;
                }

                foreach (Minion mnn in p.enemyMinions)
                {
                    if (mnn.taunt && (target.Angr >= 3 || target.Hp >= 3)) return 0;
                }
                return 20;
            }

            //------------------------------------------------------------------------------------------------------
            Minion m = target;

            if (card.name == CardDB.cardName.reincarnate)
            {
                if (m.own)
                {
                    if (m.handcard.card.deathrattle || m.ancestralspirit >= 1 || m.souloftheforest >= 1 || m.enemyBlessingOfWisdom >= 1) return 0;
                    if (m.handcard.card.Charge && ((m.numAttacksThisTurn == 1 && !m.windfury) || (m.numAttacksThisTurn == 2 && m.windfury))) return 0;
                    if (m.wounded || m.Angr < m.handcard.card.Attack || (m.silenced && PenalityManager.instance.specialMinions.ContainsKey(m.name))) return 0;


                    bool hasOnMinionDiesMinion = false;
                    foreach (Minion mnn in p.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.scavenginghyena && m.handcard.card.race == TAG_RACE.PET) hasOnMinionDiesMinion = true;
                        if (mnn.name == CardDB.cardName.flesheatingghoul || mnn.name == CardDB.cardName.cultmaster) hasOnMinionDiesMinion = true;
                    }
                    if (hasOnMinionDiesMinion) return 0;

                    return 500;
                }
                else
                {
                    if (m.name == CardDB.cardName.nerubianegg && m.Angr <= 4 && !m.taunt) return 500;
                    if (m.taunt && !m.handcard.card.tank) return 0;
                    if (m.enemyBlessingOfWisdom >= 1) return 0;
                    if (m.Angr > m.handcard.card.Attack || m.Hp > m.handcard.card.Health) return 0;
                    if (m.name == CardDB.cardName.abomination || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.unstableghoul || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;

                }

            }

            if (card.name == CardDB.cardName.knifejuggler && p.mobsplayedThisTurn > 1 || (p.ownHeroName == HeroEnum.shaman && p.ownAbilityReady == false))
            {
                return 20;
            }

            if (card.name == CardDB.cardName.flametonguetotem && p.ownMinions.Count == 0)
            {
                return 100;
            }

            if (card.name == CardDB.cardName.stampedingkodo)
            {
                bool found = false;
                foreach (Minion mi in p.enemyMinions)
                {
                    if (mi.Angr <= 2) found = true;
                }
                if (!found) return 20;
            }

            if (name == CardDB.cardName.windfury)
            {
                if (!m.own) return 500;
                if (m.own && !m.Ready) return 500;
            }

            if ((name == CardDB.cardName.wildgrowth || name == CardDB.cardName.nourish) && p.ownMaxMana == 9 && !(p.ownHeroName == HeroEnum.thief && p.cardsPlayedThisTurn == 0))
            {
                return 500;
            }

            if (name == CardDB.cardName.ancestralspirit)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.name == CardDB.cardName.deathlord || m.name == CardDB.cardName.zombiechow || m.name == CardDB.cardName.dancingswords) return 0;
                    return 500;
                }
                if (target.own && !target.isHero)
                {
                    if (this.specialMinions.ContainsKey(m.name)) return -5;
                    return 0;
                }

            }

            if (name == CardDB.cardName.sylvanaswindrunner)
            {
                if (p.enemyMinions.Count == 0)
                {
                    return 10;
                }
            }

            if (name == CardDB.cardName.betrayal && !target.own && !target.isHero)
            {
                if (m.Angr == 0) return 30;
                if (p.enemyMinions.Count == 1) return 30;
            }




            if (name == CardDB.cardName.bite)
            {
                if ((p.ownHero.numAttacksThisTurn == 0 || (p.ownHero.windfury && p.ownHero.numAttacksThisTurn == 1)) && !p.ownHero.frozen)
                {

                }
                else
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.deadlypoison)
            {
                return p.ownWeaponDurability * 2;
            }

            if (name == CardDB.cardName.coldblood)
            {
                if (lethal) return 0;
                return 25;
            }

            if (name == CardDB.cardName.bloodmagethalnos)
            {
                return 10;
            }

            if (name == CardDB.cardName.frostbolt)
            {
                if (!target.own && !target.isHero)
                {
                    if (m.handcard.card.cost <= 2)
                        return 15;
                }
                return 15;
            }

            if (!lethal && choice == 1 && name == CardDB.cardName.druidoftheclaw)
            {
                return 20;
            }


            if (name == CardDB.cardName.poweroverwhelming)
            {
                if (target.own && !target.isHero && !m.Ready)
                {
                    return 500;
                }
            }

            if (name == CardDB.cardName.frothingberserker)
            {
                if (p.cardsPlayedThisTurn >= 1) pen = 5;
            }

            if (name == CardDB.cardName.handofprotection)
            {
                if (m.Hp == 1) pen = 15;
            }

            if (lethal)
            {
                if (name == CardDB.cardName.corruption)
                {
                    int beasts = 0;
                    foreach (Minion mm in p.ownMinions)
                    {
                        if (mm.Ready && (mm.handcard.card.name == CardDB.cardName.questingadventurer || mm.handcard.card.name == CardDB.cardName.archmageantonidas || mm.handcard.card.name == CardDB.cardName.manaaddict || mm.handcard.card.name == CardDB.cardName.manawyrm || mm.handcard.card.name == CardDB.cardName.wildpyromancer)) beasts++;
                    }
                    if (beasts == 0) return 500;
                }
            }

            if (name == CardDB.cardName.divinespirit)
            {
                if (lethal)
                {
                    if (!target.own && !target.isHero)
                    {
                        if (!m.taunt)
                        {
                            return 500;
                        }
                        else
                        {
                            // combo for killing with innerfire and biggamehunter
                            if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && (m.Hp >= 4 || (p.owncards.Find(x => x.card.name == CardDB.cardName.divinespirit) != null && m.Hp >= 2)))
                            {
                                return 0;
                            }
                            return 500;
                        }
                    }
                }
                else
                {
                    if (!target.own && !target.isHero)
                    {

                        // combo for killing with innerfire and biggamehunter
                        if (p.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && p.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && m.Hp >= 4)
                        {
                            return 0;
                        }
                        return 500;
                    }

                }

                if (target.own && !target.isHero)
                {

                    if (m.Hp >= 4)
                    {
                        return 0;
                    }
                    return 15;
                }

            }



            if (name == CardDB.cardName.knifejuggler)
            {
                if (p.mobsplayedThisTurn >= 1)
                {
                    return 20;
                }
            }

            if ((name == CardDB.cardName.polymorph || name == CardDB.cardName.hex))
            {



                if (target.own && !target.isHero)
                {
                    return 500;
                }

                if (!target.own && !target.isHero)
                {
                    if (target.allreadyAttacked) return 30;
                    Minion frog = target;
                    if (this.priorityTargets.ContainsKey(frog.name)) return 0;
                    if (frog.Angr >= 4 && frog.Hp >= 4) return 0;
                    return 30;
                }

            }


            if ((name == CardDB.cardName.defenderofargus || name == CardDB.cardName.sunfuryprotector) && p.ownMinions.Count == 1)
            {
                return 40;
            }
            if ((name == CardDB.cardName.defenderofargus || name == CardDB.cardName.sunfuryprotector) && p.ownMinions.Count == 0)
            {
                return 50;
            }

            if (name == CardDB.cardName.unleashthehounds)
            {
                if (p.enemyMinions.Count <= 1)
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.equality) // aoe penality
            {
                if (p.enemyMinions.Count <= 2 || (p.ownMinions.Count - p.enemyMinions.Count >= 1))
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.bloodsailraider && p.ownWeaponDurability == 0)
            {
                //if you have bloodsailraider and no weapon equiped, but own a weapon:
                foreach (Handmanager.Handcard hc in p.owncards)
                {
                    if (hc.card.type == CardDB.cardtype.WEAPON) return 10;
                }
            }



            if (name == CardDB.cardName.innerfire)
            {
                if (m.name == CardDB.cardName.lightspawn) pen = 500;
            }

            if (name == CardDB.cardName.huntersmark)
            {
                if (target.own && !target.isHero) pen = 500; // dont use on own minions
                if (!target.own && !target.isHero && (target.Hp <= 4) && target.Angr <= 4) // only use on strong minions
                {
                    pen = 20;
                }
            }


            if ((name == CardDB.cardName.aldorpeacekeeper || name == CardDB.cardName.humility))
            {
                if (target != null)
                {
                    if (target.own) pen = 500; // dont use on own minions
                    if (!target.own && target.Angr <= 3) // only use on strong minions
                    {
                        pen = 30;
                    }
                    if (m.name == CardDB.cardName.lightspawn) pen = 500;
                }
                else
                {
                    pen = 50;
                }
            }



            if (name == CardDB.cardName.defiasringleader && p.cardsPlayedThisTurn == 0)
            { pen = 10; }
            if (name == CardDB.cardName.bloodknight)
            {
                int shilds = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                foreach (Minion min in p.enemyMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                if (shilds == 0)
                {
                    pen = 10;
                }
            }
            if (name == CardDB.cardName.direwolfalpha)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                { pen = 5; }
            }
            if (name == CardDB.cardName.abusivesergeant)
            {
                int ready = 0;
                foreach (Minion min in p.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                {
                    pen = 5;
                }
            }

            if (name == CardDB.cardName.madbomber || name == CardDB.cardName.madderbomber)
            {
                //penalize for any own minions with health equal to potential attack amount
                //to lessen risk of losing your own minion
                int maxAtk = 3;
                if (name == CardDB.cardName.madderbomber) maxAtk = 5;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (mnn.Hp <= maxAtk)
                    {
                        if (mnn.Ready) pen += mnn.Angr * 20;
                    }
                    if (mnn.divineshild) pen += (100 / (p.ownMinions.Count + p.enemyMinions.Count + 2));
                }
            }

            //Should resolve Davidmann's issue, in attempting to play a mech card, onto field first, if possible
            if (name == CardDB.cardName.goblinblastmage) //can add other cards that require mechs to be fielded first
            {
                bool mechOnField = false;
                int castCost = card.getManaCost(p, 4);

                foreach (Minion mnn in p.ownMinions)
                {
                    if (m.handcard.card.race == TAG_RACE.MECHANICAL) mechOnField = true;
                    if (mechOnField) break;
                }
                if (!mechOnField)
                {
                    foreach (Handmanager.Handcard hc in p.owncards)
                    {
                        if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= (hc.getManaCost(p) + castCost)) return 500;//hc.card.race Should work? Nohero please confirm!
                        else if (hc.card.race == TAG_RACE.MECHANICAL && p.mana >= hc.getManaCost(p)) return 50;

                    }
                }
                else return 20;
            }

            if (name == CardDB.cardName.draeneitotemcarver)
            {
                bool totemOnField = false;
                if (p.ownHeroName == HeroEnum.shaman && p.ownAbilityReady == true) return 20;
                foreach (Minion mnn in p.ownMinions)
                {
                    if (m.handcard.card.race == TAG_RACE.TOTEM) totemOnField = true;
                    if (totemOnField) break;
                }
                if (!totemOnField) return 20;

            }


            if (returnHandDatabase.ContainsKey(name))
            {
                if (name == CardDB.cardName.vanish)
                {
                    //dont vanish if we have minons on board wich are ready
                    bool haveready = false;
                    foreach (Minion mins in p.ownMinions)
                    {
                        if (mins.Ready) haveready = true;
                    }
                    if (haveready) pen += 10;
                }

                if (target.own && !target.isHero)
                {
                    Minion mnn = target;
                    if (mnn.Ready) pen += 10;
                }
            }

            return pen;
        }