Example #1
0
        //   Whenever your opponent casts a spell, gain +1 Attack.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
        {
            if (c.type == CardDB.cardtype.SPELL && wasOwnCard != triggerEffectMinion.own)
            {
                p.minionGetBuffed(triggerEffectMinion, 1, 0);
            }
        }
Example #2
0
 // erhält jedes Mal +1/+1, wenn Ihr eine Karte mit uberladung< ausspielt.
 public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
 {
     if (wasOwnCard == triggerEffectMinion.own && c.Recall)
     {
         p.minionGetBuffed(triggerEffectMinion, 1, 1);
     }
 }
Example #3
0
        CardDB.Card d = CardDB.Instance.getCardDataFromID(CardDB.cardIDEnum.EX1_614t);//flameofazzinoth
//    beschwört jedes mal eine flamme von azzinoth (2/1), wenn ihr eine karte ausspielt.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
        {
            if (wasOwnCard == triggerEffectMinion.own)
            {
                    p.callKid(d, triggerEffectMinion.zonepos, triggerEffectMinion.own);

            }
        }
Example #4
0
//    zieht jedes mal eine karte, wenn ihr einen zauber wirkt.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
        {
            if (c.type == CardDB.cardtype.SPELL && wasOwnCard == triggerEffectMinion.own)
            {
                p.drawACard(p.getArandomCardFromDeck(wasOwnCard), wasOwnCard);
            }

        }
Example #5
0
        //    Whenever your opponent casts a spell, gain a copy of it and give them a Coin.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
        {
            if (c.type == CardDB.cardtype.SPELL && c.name != CardDB.cardName.gallywixscoin && wasOwnCard != triggerEffectMinion.own)
            {
                p.drawACard(c.cardIDenum, triggerEffectMinion.own, true);
                p.drawACard(CardDB.cardName.gallywixscoin, wasOwnCard, true);
            }
        }
Example #6
0
 public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
 {
     if (wasOwnCard == triggerEffectMinion.own && c.type == CardDB.cardtype.SPELL)
     {
         int place = (wasOwnCard)? p.playerFirst.ownMinions.Count : p.playerSecond.ownMinions.Count;
         p.callKid(card, place, wasOwnCard);
     }
 }
Example #7
0
 public Handcard(CardDB.Card c)
 {
     this.position = 0;
     this.entity = -1;
     this.card = c;
     this.addattack = 0;
     this.addHp = 0;
 }
Example #8
0
 //public Movegenerator(Silverfish sf)
 //{
 //    this.sf = sf;
 //    pen = sf.PenalityManager;
 //}
 public CardDB.Card getChooseCard(CardDB.Card c, int choice)
 {
     if (choice == 1 && CardDB.Instance.choose1database.ContainsKey(c.name))
     {
         c = CardDB.Instance.getCardDataFromID(CardDB.Instance.choose1database[c.name]);
     }
     else if (choice == 2 && CardDB.Instance.choose2database.ContainsKey(c.name))
     {
         c = CardDB.Instance.getCardDataFromID(CardDB.Instance.choose2database[c.name]);
     }
     return c;
 }
Example #9
0
        // After you cast a spell, deal 2 damage randomly split among all enemies.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool ownplay, Minion m)
        {
            if (m.own == ownplay && c.type == CardDB.cardtype.SPELL)
            {
                Minion target = (ownplay) ? p.playerSecond.ownHero : p.playerFirst.ownHero;
                p.minionGetDamageOrHeal(target, 1);

                List<Minion> temp = (ownplay) ? p.playerSecond.ownMinions : p.playerFirst.ownMinions;
                if (temp.Count > 0) target = p.searchRandomMinion(temp, Playfield.searchmode.searchLowestHP);
                if (target == null) target = (ownplay) ? p.playerSecond.ownHero : p.playerFirst.ownHero;
                p.minionGetDamageOrHeal(target, 1);
            }
        }
Example #10
0
        //    Whenever your opponent plays a card, discard the top 3 cards of your deck.

        public override void onCardIsGoingToBePlayed(Playfield p, CardDB.Card c, bool wasOwnCard, Minion triggerEffectMinion)
        {
            if (wasOwnCard == triggerEffectMinion.own) return; //owner of card = owner of minion -> no effect

            if (triggerEffectMinion.own)
            {
                p.playerFirst.ownDeckSize = Math.Max(0, p.playerFirst.ownDeckSize - 3);
                p.getArandomCardFromDeck(true);
                p.getArandomCardFromDeck(true);
                p.getArandomCardFromDeck(true);
            }
            else
            {
                p.playerSecond.ownDeckSize = Math.Max(0, p.playerSecond.ownDeckSize - 3);
                p.getArandomCardFromDeck(false);
                p.getArandomCardFromDeck(false);
                p.getArandomCardFromDeck(false);
            }
        }
Example #11
0
        public bool hasEnemyThisCardInDeck(CardDB.cardIDEnum cardid)
        {
            if (this.enemyCardsPlayed.ContainsKey(cardid))
            {
                if (this.enemyCardsPlayed[cardid] == 1)
                {

                    return true;
                }
                return false;
            }
            return true;
        }
Example #12
0
 public GraveYardItem(CardDB.cardIDEnum id, int entity, bool own)
 {
     this.own = own;
     this.cardid = id;
     this.entity = entity;
 }
Example #13
0
        private int getRandomPenaltiy(CardDB.Card card, Playfield p, Minion target)
        {
            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            if (p.turnCounter >= 1)
            {
                return 0;
            }

            if (!CardDB.Instance.randomEffects.ContainsKey(card.name) && !CardDB.Instance.cardDrawBattleCryDatabase.ContainsKey(card.name))
            {
                return 0;
            }

            if (card.name == CardDB.cardName.brawl)
            {
                return 0;
            }

            if ((card.name == CardDB.cardName.cleave || card.name == CardDB.cardName.multishot)
                && ePlayer.ownMinions.Count == 2)
            {
                return 0;
            }

            if ((card.name == CardDB.cardName.deadlyshot) && ePlayer.ownMinions.Count == 1)
            {
                return 0;
            }

            if ((card.name == CardDB.cardName.arcanemissiles || card.name == CardDB.cardName.avengingwrath)
                && ePlayer.ownMinions.Count == 0)
            {
                return 0;
            }

            int cards = 0;
            cards = CardDB.Instance.randomEffects.ContainsKey(card.name) ? CardDB.Instance.randomEffects[card.name] : CardDB.Instance.cardDrawBattleCryDatabase[card.name];

            bool first = true;
            bool hasgadget = false;
            bool hasstarving = false;
            bool hasknife = false;
            bool hasFlamewaker = false;
            foreach (Minion mnn in mPlayer.ownMinions)
            {
                if (mnn.name == CardDB.cardName.gadgetzanauctioneer)
                {
                    hasgadget = true;
                }

                if (mnn.name == CardDB.cardName.starvingbuzzard)
                {
                    hasstarving = true;
                }

                if (mnn.name == CardDB.cardName.knifejuggler)
                {
                    hasknife = true;
                }

                if (mnn.name == CardDB.cardName.flamewaker)
                {
                    hasFlamewaker = true;
                }
            }

            foreach (Action a in mPlayer.playactions)
            {
                if (a.actionType == actionEnum.attackWithHero)
                {
                    first = false;
                    continue;
                }

                if (a.actionType == actionEnum.useHeroPower
                    && (mPlayer.ownHeroName != HeroEnum.shaman && mPlayer.ownHeroName != HeroEnum.warlock))
                {
                    first = false;
                    continue;
                }

                if (a.actionType == actionEnum.attackWithMinion)
                {
                    first = false;
                    continue;
                }

                if (a.actionType == actionEnum.playcard)
                {
                    if (card.name == CardDB.cardName.knifejuggler && card.type == CardDB.cardtype.MOB)
                    {
                        continue;
                    }

                    if (CardDB.Instance.cardDrawBattleCryDatabase.ContainsKey(a.card.card.name))
                    {
                        continue;
                    }

                    if (hasgadget && card.type == CardDB.cardtype.SPELL)
                    {
                        continue;
                    }

                    if (hasFlamewaker && card.type == CardDB.cardtype.SPELL)
                    {
                        continue;
                    }

                    if (hasstarving && (TAG_RACE)card.race == TAG_RACE.PET)
                    {
                        continue;
                    }

                    if (hasknife && card.type == CardDB.cardtype.MOB)
                    {
                        continue;
                    }

                    first = false;
                }
            }

            if (first == false)
            {
                return cards + mPlayer.playactions.Count + 1;
            }

            return 0;
        }
Example #14
0
        private int getAttackBuffPenality(CardDB.Card card, Minion target, Playfield p, int choice, bool lethal)
        {

                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerSecond;
                ePlayer = p.playerFirst;
            }

            CardDB.cardName name = card.name;
            if (name == CardDB.cardName.darkwispers && choice != 2) return 0;
            int pen = 0;
            //buff enemy?

            if (!lethal && (card.name == CardDB.cardName.savageroar || card.name == CardDB.cardName.bloodlust))
            {
                int targets = 0;
                foreach (Minion m in mPlayer.ownMinions)
                {
                    if (m.Ready) targets++;
                }
                if ((mPlayer.ownHero.Ready || mPlayer.ownHero.numAttacksThisTurn == 0) && card.name == CardDB.cardName.savageroar) targets++;

                if (targets <= 2)
                {
                    return 20;
                }
            }

            if (!CardDB.Instance.attackBuffDatabase.ContainsKey(name)) return 0;
            if (target == null) return 60;
            if (!target.isHero && !isTargetOwn)
            {
                if (card.type == CardDB.cardtype.MOB && mPlayer.ownMinions.Count == 0) return 0;
                //allow it if you have biggamehunter
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.card.name == CardDB.cardName.biggamehunter) return 5;
                    if (hc.card.name == CardDB.cardName.shadowworddeath) return 5;
                }
                if (card.name == CardDB.cardName.crueltaskmaster || card.name == CardDB.cardName.innerrage)
                {
                    Minion m = target;

                    if (m.Hp == 1)
                    {
                        return 0;
                    }

                    if (!m.wounded && (m.Angr >= 4 || m.Hp >= 5))
                    {
                        foreach (Handmanager.Handcard hc in mPlayer.owncards)
                        {
                            if (hc.card.name == CardDB.cardName.execute) return 0;
                        }
                    }
                    pen = 30;
                }
                else
                {
                    pen = 500;
                }
            }
            if (!target.isHero && isTargetOwn)
            {
                Minion m = target;
                if (!m.Ready)
                {
                    return 50;
                }
                if (m.Hp == 1 && !m.divineshild && !CardDB.Instance.buffing1TurnDatabase.ContainsKey(name))
                {
                    return 10;
                }
            }

            if (card.name == CardDB.cardName.blessingofmight) return 6;
            return pen;
        }
Example #15
0
 public bool hasCardinGraveyard(CardDB.cardIDEnum cardid)
 {
     foreach (GraveYardItem gyi in this.graveyard)
     {
         if (gyi.cardid == cardid) return true;
     }
     return false;
 }
Example #16
0
        private int getSpecialCardComboPenalitys(CardDB.Card card, Minion target, Playfield p, bool lethal, int choice)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            CardDB.cardName name = card.name;

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

                if (CardDB.Instance.buffingMinionsDatabase.ContainsKey(name))
                {
                    if (name == CardDB.cardName.timberwolf || name == CardDB.cardName.houndmaster)
                    {
                        int beasts = 0;
                        foreach (Minion mm in mPlayer.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 mPlayer.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 mPlayer.ownMinions)
                        {
                            if ((TAG_RACE)mm.handcard.card.race == TAG_RACE.MURLOC) beasts++;
                        }
                        if (beasts == 0) return 500;
                    }
                }
                else
                {
                    if ((name == CardDB.cardName.rendblackhand && target != null) && !isTargetOwn)
                    {
                        if ((target.taunt && target.handcard.card.rarity == 5) || target.handcard.card.name == CardDB.cardName.malganis)
                        {
                            foreach (Handmanager.Handcard hc in mPlayer.owncards)
                            {
                                if ((TAG_RACE)hc.card.race == TAG_RACE.DRAGON) return 0;
                            }
                        }
                        return 500;
                    }

                    if (name == CardDB.cardName.theblackknight)
                    {
                        int beasts = 0;
                        foreach (Minion mm in ePlayer.ownMinions)
                        {
                            if (mm.taunt) return 0;
                        }
                        return 500;
                    }
                    else
                    {
                        if ((CardDB.Instance.HealTargetDatabase.ContainsKey(name) || CardDB.Instance.HealHeroDatabase.ContainsKey(name) || CardDB.Instance.HealAllDatabase.ContainsKey(name)))
                        {
                            int beasts = 0;
                            foreach (Minion mm in mPlayer.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 || CardDB.Instance.silenceDatabase.ContainsKey(name) || ((TAG_RACE)card.race == TAG_RACE.PET && mPlayer.ownMinions.Find(x => x.name == CardDB.cardName.tundrarhino) != null) || (mPlayer.ownMinions.Find(x => x.name == CardDB.cardName.warsongcommander) != null && card.Attack <= 3) || mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null))
                            {
                                return 500;
                            }
                        }
                    }
                }
            }

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

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

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

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

            if (card.name == CardDB.cardName.baronrivendare)
            {
                foreach (Minion mnn in mPlayer.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 (mPlayer.ownMaxMana < 3 && card.name == CardDB.cardName.thecoin)
            {
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.manacost <= mPlayer.ownMaxMana && hc.card.type == CardDB.cardtype.MOB) return 5;
                }

            }

            if (name == CardDB.cardName.flare && ePlayer.ownSecretsIDList.Count >= 1 && mPlayer.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 || isTargetOwn))
            {
                return 40;
            }
            if (name == CardDB.cardName.aldorpeacekeeper && target == null)
            {
                pen = 30;
            }

            if (name == CardDB.cardName.emergencycoolant && target != null && isTargetOwn)//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 (!isTargetOwn) { return 500; }
                    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.rendblackhand)
            {
                if (target == null)
                {
                    return 50;
                }
                if (isTargetOwn)
                {
                    return 100;
                }
                if ((target.taunt && target.handcard.card.rarity == 5) || target.handcard.card.name == CardDB.cardName.malganis)
                {
                    foreach (Handmanager.Handcard hc in mPlayer.owncards)
                    {
                        if ((TAG_RACE)hc.card.race == TAG_RACE.DRAGON) return 0;
                    }
                }
                return 500;
            }

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

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

            if (name == CardDB.cardName.madbomber || name == CardDB.cardName.madderbomber)
            {
                pen = 0;
                foreach (Minion mnn in mPlayer.ownMinions)
                {
                    if (mnn.Ready & mnn.Hp < 3) pen += 5;
                }
                return pen;
            }

            //implementation
            if (name == CardDB.cardName.kidnapper && target == null)
            {
                return 15;
            }

            //------------------------------------------------------------------------------------------------------
            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 && CardDB.Instance.specialMinions.ContainsKey(m.name))) return 0;


                    bool hasOnMinionDiesMinion = false;
                    foreach (Minion mnn in mPlayer.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.scavenginghyena && m.handcard.card.race == 20) 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 (mPlayer.ownHeroName == HeroEnum.shaman && mPlayer.ownAbilityReady == false)
            {
                return 20;
            }

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

            if (card.name == CardDB.cardName.stampedingkodo)
            {
                bool found = false;
                foreach (Minion mi in ePlayer.ownMinions)
                {
                    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) && mPlayer.ownMaxMana == 9 && !(mPlayer.ownHeroName == HeroEnum.thief && mPlayer.cardsPlayedThisTurn == 0))
            {
                return 500;
            }

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

            }

            if (name == CardDB.cardName.sap || name == CardDB.cardName.dream || name == CardDB.cardName.kidnapper)
            {
                if (!m.own && (m.name == CardDB.cardName.theblackknight || name == CardDB.cardName.rendblackhand))
                {
                    return 50;
                }
            }

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

            if (name == CardDB.cardName.betrayal && !isTargetOwn && !target.isHero)
            {
                if (m.Angr == 0) return 30;
                if (ePlayer.ownMinions.Count == 1) return 30;
            }




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

                }
                else
                {
                    return 20;
                }
            }

            if (name == CardDB.cardName.deadlypoison)
            {
                return mPlayer.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 (!isTargetOwn && !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 (isTargetOwn && !target.isHero && !m.Ready)
                {
                    return 500;
                }
            }

            if (name == CardDB.cardName.frothingberserker)
            {
                if (mPlayer.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 mPlayer.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 (!isTargetOwn && !target.isHero)
                    {
                        if (!m.taunt)
                        {
                            return 500;
                        }
                        else
                        {
                            // combo for killing with innerfire and biggamehunter
                            if (mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.biggamehunter) != null && mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.innerfire) != null && (m.Hp >= 4 || (mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.divinespirit) != null && m.Hp >= 2)))
                            {
                                return 0;
                            }
                            return 500;
                        }
                    }
                }
                else
                {
                    if (!isTargetOwn && !target.isHero)
                    {

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

                }

                if (isTargetOwn && !target.isHero)
                {

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

            }

            if (name == CardDB.cardName.gangup)
            {
                int penTmP = 0;
                if (CardDB.Instance.UsefulNeedKeepDatabase.ContainsKey(name))
                {
                    penTmP = CardDB.Instance.UsefulNeedKeepDatabase[name] - target.maxHp - mPlayer.ownMaxMana + target.handcard.card.cost;
                    penTmP = -1 * Math.Min(penTmP, 0);
                }
                else
                {
                    penTmP = 40;
                }
                return penTmP;
            }

            if (name == CardDB.cardName.resurrect)
            {
                if (mPlayer.ownMaxMana < 6) return 50;
                if (mPlayer.ownMinions.Count == 7) return 500;
                if (mPlayer.ownMaxMana > 8) return 0;
                if (mPlayer.ownLastDiedMinion == CardDB.cardIDEnum.None) return 6;
                return 0;
            }

            if (name == CardDB.cardName.lavashock)
            {
                if (p.ueberladung < 1) return 15;
                return (3 - 3 * p.ueberladung);
            }

            if (name == CardDB.cardName.enhanceomechano)
            {
                if (mPlayer.ownMinions.Count == 0 && mPlayer.ownMaxMana < 5) return 500;
                int penTmP = 2 * (mPlayer.mana - 4 - mPlayer.mobsplayedThisTurn); //for accurate calculation we need hc
                if (mPlayer.mobsplayedThisTurn < 1) penTmP += 30;
                return penTmP;
            }

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

            if (name == CardDB.cardName.flamewaker)
            {
                foreach (Action a in mPlayer.playactions)
                {
                    if (a.actionType == actionEnum.playcard && a.card.card.type == CardDB.cardtype.SPELL) return 30;
                }
            }

            if ((name == CardDB.cardName.polymorph || name == CardDB.cardName.hex))
            {
                if (isTargetOwn && !target.isHero)
                {
                    return 500;
                }

                if (!isTargetOwn && !target.isHero)
                {
                    if (target.allreadyAttacked) return 30;
                    Minion frog = target;
                    if (CardDB.Instance.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) && mPlayer.ownMinions.Count == 1)
            {
                return 40;
            }
            if ((name == CardDB.cardName.defenderofargus || name == CardDB.cardName.sunfuryprotector) && mPlayer.ownMinions.Count == 0)
            {
                return 50;
            }

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

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

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

            if (name == CardDB.cardName.acidicswampooze)
            {
                if (ePlayer.ownWeaponAttack >= 1) return 0;
                if (ePlayer.ownHeroName == HeroEnum.warrior || ePlayer.ownHeroName == HeroEnum.thief || ePlayer.ownHeroName == HeroEnum.pala ) return 10;
                if (ePlayer.ownHeroName == HeroEnum.shaman || ePlayer.ownHeroName == HeroEnum.hunter) return 6;
            }

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

            if (name == CardDB.cardName.huntersmark)
            {
                if (isTargetOwn && !target.isHero) pen = 500; // dont use on own minions
                if (!isTargetOwn && !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 (isTargetOwn) pen = 500; // dont use on own minions
                    if (!isTargetOwn && 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 && mPlayer.cardsPlayedThisTurn == 0)
            { pen = 10; }
            if (name == CardDB.cardName.bloodknight)
            {
                int shilds = 0;
                foreach (Minion min in mPlayer.ownMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                foreach (Minion min in ePlayer.ownMinions)
                {
                    if (min.divineshild)
                    {
                        shilds++;
                    }
                }
                if (shilds == 0)
                {
                    pen = 10;
                }
            }
            if (name == CardDB.cardName.direwolfalpha)
            {
                int ready = 0;
                foreach (Minion min in mPlayer.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                { pen = 5; }
            }
            if (name == CardDB.cardName.abusivesergeant)
            {
                int ready = 0;
                foreach (Minion min in mPlayer.ownMinions)
                {
                    if (min.Ready)
                    { ready++; }
                }
                if (ready == 0)
                {
                    pen = 5;
                }
            }


            if (CardDB.Instance.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 mPlayer.ownMinions)
                    {
                        if (mins.Ready) haveready = true;
                    }
                    if (haveready) pen += 10;
                }

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

            return pen;
        }
Example #17
0
        private int getDamagePenality(CardDB.Card card, Minion target, Playfield p, int choice, bool lethal)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerSecond;
                ePlayer = p.playerFirst;
            }

            CardDB.cardName name = card.name;
            int pen = 0;

            if (name == CardDB.cardName.shieldslam && mPlayer.ownHero.armor == 0) return 500;
            if (name == CardDB.cardName.savagery && mPlayer.ownHero.Angr == 0) return 500;
            if (name == CardDB.cardName.keeperofthegrove && choice != 1) return 0; // look at silence penality
            
            //aoe damage *************************************************************************************
            int aoeDamageType = 0;
            if (CardDB.Instance.DamageAllEnemysDatabase.ContainsKey(name)) aoeDamageType = 1;
            else if (mPlayer.anzOwnAuchenaiSoulpriest >= 1 && CardDB.Instance.HealAllDatabase.ContainsKey(name)) aoeDamageType = 2;
            else if (CardDB.Instance.DamageAllDatabase.ContainsKey(name)) aoeDamageType = 3;
            if (aoeDamageType > 0)
            {
                if (ePlayer.ownMinions.Count == 0) return 300;

                int aoeDamage = 0;
                if (aoeDamageType == 1) aoeDamage = (card.type == CardDB.cardtype.SPELL) ? p.getSpellDamageDamage(CardDB.Instance.DamageAllEnemysDatabase[name], p.isOwnTurn) : CardDB.Instance.DamageAllEnemysDatabase[name];
                else if (aoeDamageType == 2) aoeDamage = (card.type == CardDB.cardtype.SPELL) ? p.getSpellDamageDamage(CardDB.Instance.HealAllDatabase[name], p.isOwnTurn) : CardDB.Instance.HealAllDatabase[name];
                else if (aoeDamageType == 3)
                {
                    if (name == CardDB.cardName.revenge && mPlayer.ownHero.Hp <= 12) p.getSpellDamageDamage(3, p.isOwnTurn);
                    else aoeDamage = (card.type == CardDB.cardtype.SPELL) ? p.getSpellDamageDamage(CardDB.Instance.DamageAllDatabase[name], p.isOwnTurn) : CardDB.Instance.DamageAllDatabase[name];
                }
                
                int preventDamage = 0;
                int lostOwnDamage = 0;
                int lostOwnMinions = 0;
                int survivedEnemyMinions = 0;
                int survivedEnemyMinionsAngr = 0;
                bool frothingberserkerEnemy = false;
                bool frothingberserkerOwn = false;
                bool grimpatronEnemy = false;
                bool grimpatronOwn = false;
                foreach (Minion m in ePlayer.ownMinions)
                {
                    if (aoeDamage >= m.Hp && (name == CardDB.cardName.demonwrath ? ((TAG_RACE)m.handcard.card.race == TAG_RACE.DEMON ? false : true) : true)) preventDamage += m.Angr;
                    else
                    {
                        survivedEnemyMinions++;
                        if (survivedEnemyMinionsAngr < m.Angr) survivedEnemyMinionsAngr = m.Angr;
                        if (!m.wounded && CardDB.Instance.enrageDatabase.ContainsKey(name)) preventDamage -= CardDB.Instance.enrageDatabase[name];
                        else if (m.name == CardDB.cardName.gurubashiberserker) preventDamage -= 3;
                        else if (m.name == CardDB.cardName.frothingberserker) frothingberserkerEnemy = true;
                        else if (m.name == CardDB.cardName.grimpatron) { preventDamage -= 3; grimpatronEnemy = true; }
                    }
                }
                int ownWoundedMinions = 0;
                foreach (Minion m in mPlayer.ownMinions)
                {
                    if (m.wounded) ownWoundedMinions++;
                    if (aoeDamage >= m.Hp && (name == CardDB.cardName.demonwrath ? ((TAG_RACE)m.handcard.card.race == TAG_RACE.DEMON ? false : true ) : true))
                    {
                        lostOwnDamage += m.Angr;
                        lostOwnMinions++;
                        if (!m.wounded && CardDB.Instance.enrageDatabase.ContainsKey(name)) lostOwnDamage += CardDB.Instance.enrageDatabase[name];
                        else if (m.name == CardDB.cardName.gurubashiberserker && m.Hp > 1) lostOwnDamage += 3;
                        else if (m.name == CardDB.cardName.frothingberserker) frothingberserkerOwn = true;
                        else if (m.name == CardDB.cardName.grimpatron) { lostOwnDamage += 3; grimpatronOwn = true; }
                    }
                }
                int hasExecute = 0;
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.card.name == CardDB.cardName.execute) hasExecute++;
                }

                if (aoeDamageType == 1) //only enemy
                {
                    if (preventDamage > 5 || (ePlayer.ownMinions.Count - survivedEnemyMinions) >= 4) return 0;
                    else if (name == CardDB.cardName.holynova && preventDamage >= 0 && ownWoundedMinions > 2) return 20;

                    if (hasExecute > 0)
                    {
                        if (survivedEnemyMinions <= hasExecute) return 0;
                        preventDamage += survivedEnemyMinionsAngr;
                        if (preventDamage > 6) preventDamage = 6;
                    }
                    
                    return (6 - preventDamage) * 20;
                }
                else
                {
                    if (mPlayer.ownMinions.Count - lostOwnMinions - survivedEnemyMinions > 0)
                    {
                        if (preventDamage >= lostOwnDamage) return 0;
                        return (lostOwnDamage - preventDamage) * 2;
                    }
                    else
                    {
                        if (preventDamage >= lostOwnDamage * 2 + 1) return 0;
                        int MinionBalance = lostOwnMinions - (ePlayer.ownMinions.Count - survivedEnemyMinions);
                        if (MinionBalance > 0 && preventDamage <= lostOwnDamage) return 80;
                        return 30;
                    }
                }
            }
            //END aoe damage **********************************************************************************

            if (target == null) return 0;

            if (isTargetOwn && target.isHero)
            {
                if (CardDB.Instance.DamageTargetDatabase.ContainsKey(name) || CardDB.Instance.DamageTargetSpecialDatabase.ContainsKey(name) || (mPlayer.anzOwnAuchenaiSoulpriest >= 1 && CardDB.Instance.HealTargetDatabase.ContainsKey(name)))
                {
                    pen = 500;
                }
            }

            if (!lethal && !isTargetOwn && target.isHero)
            {
                if (name == CardDB.cardName.baneofdoom)
                {
                    pen = 500;
                }
            }

            if (isTargetOwn && !target.isHero)
            {
                if (CardDB.Instance.DamageTargetDatabase.ContainsKey(name) || (mPlayer.anzOwnAuchenaiSoulpriest >= 1 && CardDB.Instance.HealTargetDatabase.ContainsKey(name)))
                {
                    // no pen if own is enrage
                    Minion m = target;

                    //standard ones :D (mostly carddraw
                    if (CardDB.Instance.enrageDatabase.ContainsKey(m.name) && !m.wounded && m.Ready)
                    {
                        return pen;
                    }

                    // no pen if we have battlerage for example
                    int dmg = CardDB.Instance.DamageTargetDatabase.ContainsKey(name) ? CardDB.Instance.DamageTargetDatabase[name] : CardDB.Instance.HealTargetDatabase[name];

                    if (m.name == CardDB.cardName.madscientist && mPlayer.ownHeroStartClass == TAG_CLASS.HUNTER) return 500;
                    if (m.handcard.card.deathrattle) return 10;
                    if (m.Hp > dmg)
                    {
                        if (m.name == CardDB.cardName.acolyteofpain && mPlayer.owncards.Count <= 3) return 0;
                        if (m.name == CardDB.cardName.dragonegg && mPlayer.ownMinions.Count <= 6) return 5;
                        if (m.name == CardDB.cardName.impgangboss && mPlayer.ownMinions.Count <= 6) return 0;
                        if (m.name == CardDB.cardName.grimpatron && mPlayer.ownMinions.Count <= 6) return 0;
                        foreach (Handmanager.Handcard hc in mPlayer.owncards)
                        {
                            if (hc.card.name == CardDB.cardName.battlerage) return pen;
                            if (hc.card.name == CardDB.cardName.rampage) return pen;
                        }
                    }


                    pen = 500;
                }

                //special cards
                if (CardDB.Instance.DamageTargetSpecialDatabase.ContainsKey(name))
                {
                    int dmg = CardDB.Instance.DamageTargetSpecialDatabase[name];
                    Minion m = target;
                    if ((name == CardDB.cardName.crueltaskmaster || name == CardDB.cardName.innerrage) && m.Hp >= 2) return 0;
                    if ((name == CardDB.cardName.demonfire || name == CardDB.cardName.demonheart) && (TAG_RACE)m.handcard.card.race == TAG_RACE.DEMON) return 0;
                    if (name == CardDB.cardName.earthshock && m.Hp >= 2)
                    {
                        if ((!m.silenced && (m.name == CardDB.cardName.ancientwatcher || m.name == CardDB.cardName.ragnarosthefirelord)) || m.Angr < m.handcard.card.Attack || m.maxHp < m.handcard.card.Health || (m.frozen && !m.playedThisTurn && m.numAttacksThisTurn == 0))
                            return 0;
                        if (CardDB.Instance.priorityDatabase.ContainsKey(m.name) && !m.silenced)
                        {
                            return 500;
                        }
                    }
                    if (name == CardDB.cardName.earthshock)//dont silence other own minions
                    {
                        return 500;
                    }

                    if (m.Hp > dmg)
                    {
                        if (CardDB.Instance.enrageDatabase.ContainsKey(m.name) && !m.wounded && m.Ready) // no pen if own is enrage
                        {
                            return pen;
                        }

                        foreach (Handmanager.Handcard hc in mPlayer.owncards) // no pen if we have battlerage for example
                        {
                            if (hc.card.name == CardDB.cardName.battlerage) return pen;
                            if (hc.card.name == CardDB.cardName.rampage) return pen;
                        }
                    }

                    pen = 500;
                }
            }
            if (!isTargetOwn && !target.isHero)
            {
                int realDamage = 0;
                if (CardDB.Instance.DamageTargetSpecialDatabase.ContainsKey(name)) realDamage = (card.type == CardDB.cardtype.SPELL) ?  p.getSpellDamageDamage(CardDB.Instance.DamageTargetSpecialDatabase[name], p.isOwnTurn) : CardDB.Instance.DamageTargetSpecialDatabase[name];
                else if (CardDB.Instance.DamageTargetDatabase.ContainsKey(name)) realDamage = (card.type == CardDB.cardtype.SPELL) ? p.getSpellDamageDamage(CardDB.Instance.DamageTargetDatabase[name], p.isOwnTurn) : CardDB.Instance.DamageTargetDatabase[name];
                if (realDamage > 0)
                {
                    if (name == CardDB.cardName.soulfire && target.maxHp <= realDamage - 2) pen = 10;
                    if (name == CardDB.cardName.baneofdoom && target.Hp > realDamage) pen = 10;
                    if (name == CardDB.cardName.shieldslam && (target.Hp <= 4 || target.Angr <= 4)) pen = 20;
                }
                if (realDamage == 0) realDamage = card.Attack;
                if (target.name == CardDB.cardName.grimpatron && realDamage < target.Hp) return 500;
            }

            return pen;
        }
Example #18
0
        private int getHPBuffPenality(CardDB.Card card, Minion target, Playfield p, int choice)
        {
            bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            CardDB.cardName name = card.name;
            if (name == CardDB.cardName.darkwispers && choice != 2) return 0;

            // Drew: We need a target for this card!
            if (name == CardDB.cardName.darkwispers && target == null) return 500;

            int pen = 0;

            //buff enemy?
            if (!CardDB.Instance.healthBuffDatabase.ContainsKey(name)) return 0;

            // Drew: We add a null check here to avoid interfering with other logic with the previous conditional statement.
            if (target != null && !isTargetOwn && !CardDB.Instance.tauntBuffDatabase.ContainsKey(name))
            {
                pen = 500;
            }

            return pen;
        }
Example #19
0
        private int getTauntBuffPenality(CardDB.cardName name, Minion target, Playfield p, int choice)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            int pen = 0;
            //buff enemy?
            if (!CardDB.Instance.tauntBuffDatabase.ContainsKey(name)) return 0;
            if (name == CardDB.cardName.markofnature && choice != 2) return 0;
            if (name == CardDB.cardName.darkwispers && choice != 2) return 0;

            // Drew: We need a target for this card!
            if (name == CardDB.cardName.darkwispers && target == null) return 500;

            if (!target.isHero && !isTargetOwn)
            {
                //allow it if you have black knight
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.card.name == CardDB.cardName.theblackknight) return 0;
                }

                // allow taunting if target is priority and others have taunt
                bool enemyhasTaunts = false;
                foreach (Minion mnn in ePlayer.ownMinions)
                {
                    if (mnn.taunt)
                    {
                        enemyhasTaunts = true;
                        break;
                    }
                }
                if (enemyhasTaunts && CardDB.Instance.priorityDatabase.ContainsKey(target.name) && !target.silenced && !target.taunt)
                {
                    return 0;
                }

                pen = 500;
            }

            return pen;
        }
Example #20
0
 public int getValueOfUsefulNeedKeepPriority(CardDB.cardName name)
 {
     int ret = 0;
     if (CardDB.Instance.UsefulNeedKeepDatabase.ContainsKey(name)) ret = CardDB.Instance.UsefulNeedKeepDatabase[name];
     return ret;
 }
Example #21
0
        ///secret strategys pala
        /// -Attack lowest enemy. If you can’t, use noncombat means to kill it. 
        /// -attack with something able to withstand 2 damage. 
        /// -Then play something that had low health to begin with to dodge Repentance. 
        /// 
        ///secret strategys hunter
        /// - kill enemys with your minions with 2 or less heal.
        ///  - Use the smallest minion available for the first attack 
        ///  - Then smack them in the face with whatever’s left. 
        ///  - If nothing triggered until then, it’s a Snipe, so throw something in front of it that won’t die or is expendable.
        /// 
        ///secret strategys mage
        /// - Play a small minion to trigger Mirror Entity.
        /// Then attack the mage directly with the smallest minion on your side. 
        /// If nothing triggered by that point, it’s either Spellbender or Counterspell, so hold your spells until you can (and have to!) deal with either. 

        private int getPlayCardSecretPenality(CardDB.Card c, Playfield p)
        {
            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            int pen = 0;
            if (ePlayer.ownSecretsIDList.Count == 0)
            {
                return 0;
            }

            if (c.name == CardDB.cardName.flare)
            {
                return 0;
            }

            int attackedbefore = 0;

            foreach (Minion mnn in mPlayer.ownMinions)
            {
                if (mnn.numAttacksThisTurn >= 1)
                {
                    attackedbefore++;
                }
            }

            if (c.name == CardDB.cardName.acidicswampooze
                && (ePlayer.ownHeroStartClass == TAG_CLASS.WARRIOR || ePlayer.ownHeroStartClass == TAG_CLASS.ROGUE || ePlayer.ownHeroStartClass == TAG_CLASS.PALADIN))
            {
                if (ePlayer.ownHeroStartClass == TAG_CLASS.ROGUE && ePlayer.ownWeaponAttack <= 2)
                {
                    pen += 100;
                }
                else
                {
                    if (ePlayer.ownWeaponAttack <= 1)
                    {
                        pen += 100;
                    }
                }
            }

            if (ePlayer.ownHeroStartClass == TAG_CLASS.HUNTER)
            {
                if (c.type == CardDB.cardtype.MOB
                    && (attackedbefore == 0 || c.Health <= 4
                        || (ePlayer.ownHero.Hp >= ePlayer.ownHeroHpStarted && attackedbefore >= 1)))
                {
                    pen += 10;
                }
            }

            if (ePlayer.ownHeroStartClass == TAG_CLASS.MAGE)
            {
                if (c.type == CardDB.cardtype.MOB)
                {
                    Minion m = new Minion
                    {
                        Hp = c.Health,
                        maxHp = c.Health,
                        Angr = c.Attack,
                        taunt = c.tank,
                        name = c.name
                    };

                    // play first the small minion:
                    if ((!this.isOwnLowestInHand(m, p) && mPlayer.mobsplayedThisTurn == 0)
                        || (mPlayer.mobsplayedThisTurn == 0 && attackedbefore >= 1))
                    {
                        pen += 10;
                    }
                }

                if (c.type == CardDB.cardtype.SPELL && mPlayer.cardsPlayedThisTurn == mPlayer.mobsplayedThisTurn)
                {
                    pen += 10;
                }
            }

            if (ePlayer.ownHeroStartClass == TAG_CLASS.PALADIN)
            {
                if (c.type == CardDB.cardtype.MOB)
                {
                    Minion m = new Minion
                    {
                        Hp = c.Health,
                        maxHp = c.Health,
                        Angr = c.Attack,
                        taunt = c.tank,
                        name = c.name
                    };
                    if ((!this.isOwnLowestInHand(m, p) && mPlayer.mobsplayedThisTurn == 0) || attackedbefore == 0)
                    {
                        pen += 10;
                    }
                }
            }

            return pen;
        }
Example #22
0
        private int playSecretPenality(CardDB.Card card, Playfield p)
        {
            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            //penality if we play secret and have playable kirintormage
            int pen = 0;
            if (card.Secret)
            {
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.card.name == CardDB.cardName.kirintormage && mPlayer.mana >= hc.getManaCost(p, p.isOwnTurn))
                    {
                        pen = 500;
                    }
                }
            }

            return pen;
        }
Example #23
0
        public int anzCardsInDeck(CardDB.cardIDEnum cardid)
        {
            int ret = 2;
            CardDB.Card c = CardDB.Instance.getCardDataFromID(cardid);
            if (c.rarity == 5) ret = 1;//you can have only one rare;

            if (this.enemyCardsPlayed.ContainsKey(cardid))
            {
                if (this.enemyCardsPlayed[cardid] == 1)
                {

                    return 1;
                }
                return 0;
            }
            return ret;

        }
Example #24
0
        private int getHealPenality(CardDB.cardName name, Minion target, Playfield p, int choice, bool lethal)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            ///Todo healpenality for aoe heal
            ///todo auchenai soulpriest
            if (mPlayer.anzOwnAuchenaiSoulpriest >= 1) return 0;
            if (name == CardDB.cardName.ancientoflore && choice != 2) return 0;
            int pen = 0;
            int heal = 0;
            /*if (HealHeroDatabase.ContainsKey(name))
            {
                heal = HealHeroDatabase[name];
                if (target == 200) pen = 500; // dont heal enemy
                if ((target == 100 || target == -1) && mPlayer.ownHeroHp + heal > 30) pen = mPlayer.ownHeroHp + heal - 30;
            }*/

            if (name == CardDB.cardName.treeoflife)
            {
                int mheal = 0;
                int wounded = 0;
                //int eheal = 0;
                if (mPlayer.ownHero.wounded) wounded++;
                foreach (Minion mi in mPlayer.ownMinions)
                {
                    mheal += Math.Min((mi.maxHp - mi.Hp), 4);
                    if (mi.wounded) wounded++;
                }
                //Console.WriteLine(mheal + " circle");
                if (mheal == 0) return 500;
                if (mheal <= 7 && wounded <= 2) return 20;
            }

            if (name == CardDB.cardName.circleofhealing)
            {
                int mheal = 0;
                int wounded = 0;
                //int eheal = 0;
                foreach (Minion mi in mPlayer.ownMinions)
                {
                    mheal += Math.Min((mi.maxHp - mi.Hp), 4);
                    if (mi.wounded) wounded++;
                }
                //Console.WriteLine(mheal + " circle");
                if (mheal == 0) return 500;
                if (mheal <= 7 && wounded <= 2) return 20;
            }

            if (CardDB.Instance.HealTargetDatabase.ContainsKey(name))
            {
                if (target == null) return 10;
                //Helpfunctions.Instance.ErrorLog("pencheck for " + name + " " + target.entitiyID + " " + target.isHero  + " " + target.own);
                heal = CardDB.Instance.HealTargetDatabase[name];
                if (target.isHero && !isTargetOwn) return 510; // dont heal enemy
                //Helpfunctions.Instance.ErrorLog("pencheck for " + name + " " + target.entitiyID + " " + target.isHero + " " + target.own);
                if ((target.isHero && isTargetOwn) && mPlayer.ownHero.Hp == 30) return 150;
                if ((target.isHero && isTargetOwn) && mPlayer.ownHero.Hp + heal - 1 > 30) pen = mPlayer.ownHero.Hp + heal - 30;
                Minion m = new Minion();

                if (!target.isHero && isTargetOwn)
                {
                    m = target;
                    int wasted = 0;
                    if (m.Hp == m.maxHp) return 500;
                    if (m.Hp + heal - 1 > m.maxHp) wasted = m.Hp + heal - m.maxHp;
                    pen = wasted;

                    if (m.taunt && wasted <= 2 && m.Hp < m.maxHp) pen -= 5; // if we heal a taunt, its good :D

                    if (m.Hp + heal <= m.maxHp) pen = -1;
                }

                if (!target.isHero && !isTargetOwn)
                {
                    m = target;
                    if (m.Hp == m.maxHp) return 500;
                    // no penality if we heal enrage enemy
                    if (CardDB.Instance.enrageDatabase.ContainsKey(m.name))
                    {
                        return pen;
                    }
                    // no penality if we have heal-trigger :D
                    int i = 0;
                    foreach (Minion mnn in mPlayer.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.northshirecleric) i++;
                        if (mnn.name == CardDB.cardName.lightwarden) i++;
                    }
                    foreach (Minion mnn in ePlayer.ownMinions)
                    {
                        if (mnn.name == CardDB.cardName.northshirecleric) i--;
                        if (mnn.name == CardDB.cardName.lightwarden) i--;
                    }
                    if (i >= 1) return pen;

                    // no pen if we have slam

                    foreach (Handmanager.Handcard hc in mPlayer.owncards)
                    {
                        if (hc.card.name == CardDB.cardName.slam && m.Hp < 2) return pen;
                        if (hc.card.name == CardDB.cardName.backstab) return pen;
                    }

                    pen = 500;
                }


            }

            return pen;
        }
Example #25
0
        public int getProbOfEnemyHavingCardInHand(CardDB.cardIDEnum cardid, int handsize, int decksize)
        {
            //calculates probability \in [0,...,100]


            int cardsremaining = this.anzCardsInDeck(cardid);
            if (cardsremaining == 0) return 0;
            double retval = 0.0;
            //http://de.wikipedia.org/wiki/Hypergeometrische_Verteilung (we calculte 1-p(x=0))

            if (cardsremaining == 1)
            {
                retval = 1.0 - ((double)(decksize)) / ((double)(decksize + handsize));
            }
            else
            {
                retval = 1.0 - ((double)(decksize * (decksize - 1))) / ((double)((decksize + handsize) * (decksize + handsize - 1)));
            }

            retval = Math.Min(retval, 1.0);

            return (int)(100.0 * retval);
        }
Example #26
0
        private int getCardDrawPenality(CardDB.cardName name, Minion target, Playfield p, int choice, bool lethal)
        {
            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            // penality if carddraw is late or you have enough cards
            int pen = 0;
            if (!CardDB.Instance.cardDrawBattleCryDatabase.ContainsKey(name)) return 0;
            if (name == CardDB.cardName.ancientoflore && choice != 1) return 0;
            if (name == CardDB.cardName.wrath && choice != 2) return 0;
            if (name == CardDB.cardName.nourish && choice != 2) return 0;
            if (name == CardDB.cardName.grovetender && choice != 2) return 0;
            if (name == CardDB.cardName.tracking) return 0;

            int carddraw = CardDB.Instance.cardDrawBattleCryDatabase[name];
            if (carddraw == 0)
            {
                switch(name)
                {
                    case CardDB.cardName.harrisonjones:
                        carddraw = ePlayer.ownWeaponDurability;
                        if (carddraw == 0 && (ePlayer.ownHeroStartClass != TAG_CLASS.DRUID && ePlayer.ownHeroStartClass != TAG_CLASS.MAGE && ePlayer.ownHeroStartClass != TAG_CLASS.WARLOCK && ePlayer.ownHeroStartClass != TAG_CLASS.PRIEST)) return 5;
                        break;

                    case CardDB.cardName.divinefavor:
                        carddraw = ePlayer.owncards.Count - (mPlayer.owncards.Count);
                        if (carddraw <= 0) return 500;
                        break;

                    case CardDB.cardName.battlerage:
                        foreach (Minion mnn in mPlayer.ownMinions)
                        {
                            if (mnn.wounded) carddraw++;
                        }
                        if (carddraw == 0) return 500;
                        break;

                    case CardDB.cardName.slam:
                        if (target != null && target.Hp >= 3) carddraw = 1;
                        if (carddraw == 0) return 4;
                        break;

                    case CardDB.cardName.mortalcoil:
                        if (target != null && target.Hp == 1) carddraw = 1;
                        if (carddraw == 0) return 15;
                        break;

                    case CardDB.cardName.quickshot:
                        carddraw = (mPlayer.owncards.Count > 0) ? 0 : 1;
                        if (carddraw == 0) return 4;
                        break;

                    case CardDB.cardName.thoughtsteal:
                        carddraw = Math.Min(2, ePlayer.ownDeckSize);
                        if (carddraw == 2) break;
                        if (carddraw == 1) pen +=4;
                        else
                        {
                            foreach (Minion mnn in mPlayer.ownMinions)
                            {
                                if (CardDB.Instance.spellDependentDatabase.ContainsKey(mnn.name)) return 0;
                            }
                            return 500;
                        }
                        break;
                    
                    case CardDB.cardName.mindvision:
                        carddraw = Math.Min(1, ePlayer.owncards.Count);
                        if (carddraw != 1)
                        {
                            int scales = 0;
                            foreach (Minion mnn in mPlayer.ownMinions)
                            {
                                if (CardDB.Instance.spellDependentDatabase.ContainsKey(mnn.name))
                                    if(mnn.name == CardDB.cardName.lorewalkercho) pen += 20; //if(spellDependentDatabase[mnn.name] == 0);
                                    else scales--;
                            }
                            if (scales == 0) return 500;
                            foreach (Minion mnn in ePlayer.ownMinions)
                            {
                                if (CardDB.Instance.spellDependentDatabase.ContainsKey(mnn.name) && CardDB.Instance.spellDependentDatabase[name] <= 0) scales++;
                            }
                            return (12 + scales * 4 + pen);
                        }
                        break;
                        
                    case CardDB.cardName.echoofmedivh:
                        if (mPlayer.ownMinions.Count == 0) return 500;
                        return 0;
                        break;
                        
                    case CardDB.cardName.tinkertowntechnician:
                        foreach (Minion mnn in mPlayer.ownMinions)
                        {
                            if ((TAG_RACE)mnn.handcard.card.race != TAG_RACE.MECHANICAL) pen += 4;
                        }
                        break;
                    default:
                        break;
                }
            }
            
            if (name == CardDB.cardName.farsight || name == CardDB.cardName.callpet) pen -= 10;
            //if (name == CardDB.cardName.flare) // handled in private int getSpecialCardComboPenalitys


            if (name == CardDB.cardName.lifetap)
            {
                if (lethal) return 500; //RR no benefit for lethal check
                int minmana = 10;
                bool cardOnLimit = false;
                foreach (Handmanager.Handcard hc in mPlayer.owncards)
                {
                    if (hc.manacost <= minmana)
                    {
                        minmana = hc.manacost;
                    }
                    //if (hc.getManaCost(p) == mPlayer.ownMaxMana)
                    int manac = hc.getManaCost(p, p.isOwnTurn);
                    if (manac > mPlayer.ownMaxMana - 2 && manac <= mPlayer.ownMaxMana)
                    {
                        cardOnLimit = true;
                    }

                }

                //if (sf.Ai.botBase is BehaviorRush && mPlayer.ownMaxMana <= 3 && cardOnLimit) return 6; //RR penalization for drawing the 3 first turns if we have a card in hand that we won't be able to play in Rush


                if (mPlayer.owncards.Count + mPlayer.cardsPlayedThisTurn <= 5 && minmana > mPlayer.ownMaxMana) return 0;
                if (mPlayer.owncards.Count + mPlayer.cardsPlayedThisTurn > 5) return 25;
                return Math.Max(-carddraw + 2 * mPlayer.optionsPlayedThisTurn + mPlayer.ownMaxMana - mPlayer.mana, 0);
            }

            if (mPlayer.owncards.Count + carddraw > 10) return 15 * (mPlayer.owncards.Count + carddraw - 10);
            if (mPlayer.owncards.Count + mPlayer.cardsPlayedThisTurn > 5) return (5 * carddraw) + 1;

            pen += -carddraw + 2 * mPlayer.optionsPlayedThisTurn + mPlayer.ownMaxMana - mPlayer.mana;
            return pen;
        }
Example #27
0
        private int getDestroyPenality(CardDB.cardName name, Minion target, Playfield p, bool lethal)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            if (!CardDB.Instance.destroyDatabase.ContainsKey(name) || lethal) return 0;
            int pen = 0;
            if (target == null) return 0;
            if (isTargetOwn && !target.isHero)
            {
                Minion m = target;
                if (!m.handcard.card.deathrattle)
                {
                    pen = 500;
                }
            }
            if (!isTargetOwn && !target.isHero)
            {
                // dont destroy owns ;_; (except mins with deathrattle effects)

                Minion m = target;

                if (m.allreadyAttacked)
                {
                    return 50;
                }

                if (name == CardDB.cardName.shadowwordpain)
                {
                    if (CardDB.Instance.specialMinions.ContainsKey(m.name) || m.Angr == 3 || m.Hp >= 4)
                    {
                        return 0;
                    }

                    if (m.Angr == 2) return 5;

                    return 10;
                }

                if (m.Angr >= 4 || m.Hp >= 5)
                {
                    pen = 0; // so we dont destroy cheap ones :D
                }
                else
                {
                    pen = 30;
                }

                if (name == CardDB.cardName.mindcontrol && (m.name == CardDB.cardName.direwolfalpha || m.name == CardDB.cardName.raidleader || m.name == CardDB.cardName.flametonguetotem) && ePlayer.ownMinions.Count == 1)
                {
                    pen = 50;
                }

            }

            return pen;
        }
Example #28
0
        private int getCardDrawofEffectMinions(CardDB.Card card, Playfield p)
        {
            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            int pen = 0;
            int carddraw = 0;
            if (card.type == CardDB.cardtype.SPELL)
            {
                foreach (Minion mnn in mPlayer.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.gadgetzanauctioneer) carddraw++;
                }
            }

            if (card.type == CardDB.cardtype.MOB && (TAG_RACE)card.race == TAG_RACE.PET)
            {
                foreach (Minion mnn in mPlayer.ownMinions)
                {
                    if (mnn.name == CardDB.cardName.starvingbuzzard) carddraw++;
                }
            }

            if (carddraw == 0) return 0;

            if (mPlayer.owncards.Count >= 5) return 0;
            pen = -carddraw + mPlayer.ownMaxMana - mPlayer.mana + mPlayer.optionsPlayedThisTurn;

            return pen;
        }
Example #29
0
        private int getSilencePenality(CardDB.cardName name, Minion target, Playfield p, int choice, bool lethal)
        {
                        bool isTargetOwn = false; if (target != null) isTargetOwn = target.own == p.isOwnTurn;

            Player mPlayer, ePlayer;

            if (p.isOwnTurn)
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }
            else
            {
                mPlayer = p.playerFirst;
                ePlayer = p.playerSecond;
            }

            int pen = 0;
            if (name == CardDB.cardName.keeperofthegrove && choice != 2) return 0; // look at damage penality in this case

            if (target == null)
            {
                if (name == CardDB.cardName.ironbeakowl || name == CardDB.cardName.spellbreaker || name == CardDB.cardName.keeperofthegrove)
                {
                    return 20;
                }
                return 0;
            }

            if (isTargetOwn)
            {
                if (CardDB.Instance.silenceDatabase.ContainsKey(name))
                {
                    // no pen if own is enrage
                    if (!target.silenced && CardDB.Instance.OwnNeedSilenceDatabase.ContainsKey(target.name))
                    {
                        return -5;
                    }
                    // no pen if own is enrage
                    if (target.Angr < target.handcard.card.Attack || target.maxHp < target.handcard.card.Health || (target.frozen && !target.playedThisTurn && target.numAttacksThisTurn == 0))
                    {
                        return 0;
                    }
                    pen += 500;
                }
            }
            else if (!isTargetOwn)
            {
                if (CardDB.Instance.silenceDatabase.ContainsKey(name))
                {
                    pen = 5;
                    if (lethal)
                    {
                        //during lethal we only silence taunt, or if its a mob (owl/spellbreaker) + we can give him charge
                        if (target.taunt || (name == CardDB.cardName.ironbeakowl && (mPlayer.ownMinions.Find(x => x.name == CardDB.cardName.tundrarhino) != null || mPlayer.ownMinions.Find(x => x.name == CardDB.cardName.warsongcommander) != null || mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null)) || (name == CardDB.cardName.spellbreaker && mPlayer.owncards.Find(x => x.card.name == CardDB.cardName.charge) != null)) return 0;

                        return 500;
                    }

                    if (!target.silenced && CardDB.Instance.OwnNeedSilenceDatabase.ContainsKey(target.name))
                    {
                        if (target.taunt) pen += 15;
                        return 500;
                    }

                    if (!target.silenced)
                    {
                        if (CardDB.Instance.priorityDatabase.ContainsKey(target.name)) return 0;
                        if (CardDB.Instance.silenceTargets.ContainsKey(target.name)) return 0;
                        if (target.handcard.card.deathrattle) return 0;
                    }

                    if (target.Angr <= target.handcard.card.Attack && target.maxHp <= target.handcard.card.Health && !target.taunt && !target.windfury && !target.divineshild && !target.poisonous && !CardDB.Instance.specialMinions.ContainsKey(name))
                    {
                        if (name == CardDB.cardName.keeperofthegrove) return 500;
                        return 30;
                    }

                    if (target.Angr > target.handcard.card.Attack || target.maxHp > target.handcard.card.Health)
                    {
                        return 0;
                    }

                    return pen;
                }
            }

            return pen;

        }
Example #30
0
        public int getPlayCardPenality(CardDB.Card card, Minion target, Playfield p, int choice, bool lethal)
        {
            int retval = 0;
            CardDB.cardName name = card.name;
            //there is no reason to buff HP of minon (because it is not healed)

            int abuff = getAttackBuffPenality(card, target, p, choice, lethal);
            int tbuff = getTauntBuffPenality(name, target, p, choice);
            if (name == CardDB.cardName.markofthewild && ((abuff >= 500 && tbuff == 0) || (abuff == 0 && tbuff >= 500)))
            {
                retval = 0;
            }
            else
            {
                retval += abuff + tbuff;
            }
            retval += getHPBuffPenality(card, target, p, choice);
            retval += getSilencePenality(name, target, p, choice, lethal);
            retval += getDamagePenality(card, target, p, choice, lethal);
            retval += getHealPenality(name, target, p, choice, lethal);
            //if(retval < 500) 
            retval += getCardDrawPenality(name, target, p, choice, lethal);
            retval += getCardDrawofEffectMinions(card, p);
            retval += getCardDiscardPenality(name, p);
            retval += getDestroyOwnPenality(name, target, p, lethal);

            retval += getDestroyPenality(name, target, p, lethal);
            retval += getSpecialCardComboPenalitys(card, target, p, lethal, choice);
            retval += getRandomPenaltiy(card, p, target);
            if (!lethal)
            {
                //retval += cb.getPenalityForDestroyingCombo(card, p);
                //retval += cb.getPlayValue(card.cardIDenum);
            }

            retval += playSecretPenality(card, p);
            retval += getPlayCardSecretPenality(card, p);

            //Helpfunctions.Instance.ErrorLog("retval " + retval);
            return retval;
        }