public HearthstoneBoard copy()
    {
        HearthstoneBoard board = new HearthstoneBoard();

        copyValuesTo(board);
        return(board);
    }
    public HearthstoneBoard simulateResult()
    {
        HearthstoneBoard newBoard = this.copy();

        newBoard.simulateResultNoCopy();
        return(newBoard);
    }
        public static void performTest(Func <BoardSide, BoardSide, string> setUp)
        {
            ConsoleColor defaults = Console.ForegroundColor;

            Console.ForegroundColor = ConsoleColor.Yellow;
            HearthstoneBoard b        = new HearthstoneBoard();
            BoardSide        b1       = new BoardSide();
            BoardSide        b2       = new BoardSide();
            string           testname = setUp(b1, b2);

            Console.WriteLine("Starting test: " + testname + "!--------------------------------------------------");
            Console.ForegroundColor = defaults;
            b.p1Board = b1;
            b.p2Board = b2;
            try
            {
                b.printState();
                Console.WriteLine("#####");
                // b.printEvents = true;
                List <HearthstoneBoard> res = b.simulateResults(10000);


                var dmgdist = StatisticsManager.calculateDmgDistributions(res);
                StatisticsManager.printReadableResult(dmgdist);
            }
            catch (ExceptionWithMessageWhyDoesntCSharpHaveItDeafaultComeOne e)
            {
                Console.WriteLine("An error occured when performing test " + testname + ". Message: " + e.message);
                Console.ReadLine();
            }
        }
Beispiel #4
0
    public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
    {
        board.printDebugMessage("Performing action: make extra summon: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
        BoardSide userboard = board.getBoardFromMinion(user);

        for (int i = 0; i < userboard.IndexOf(user); i++)
        {
            if (userboard[i].hasEffect(this))
            {
                return;
            }
        }
        if (current < 1)
        {
            current = count;
        }
        else
        {
            Card c = ((CardSpawnedAction)cause).spawnedCard();
            if (c == user)
            {
                return;
            }
            current--;
            board.printDebugMessage("khadgar effect used, count is now " + current, HearthstoneBoard.OutputPriority.INTENSEDEBUG);
            board.addNewMinionToBoard(board.getPlayerFromMinion(user), c.copy().setId(board.getRandomNumber(1, 9999)), board.getPositionFromMinion(c), true);
        }
    }
 //0 = not dead, 1 = dead, 2 = overkill
 public int dealDamage(int damage, HearthstoneBoard board)
 {
     if (divineShield)
     {
         foreach (Card c in board.getBoardFromMinion(this))
         {
             c.performedAction(new DivineShieldLossAction(this), board);
         }
         divineShield = false;
         board.printDebugMessage("Damage taken: 0 (divine shield pop) on " + getReadableName(), HearthstoneBoard.OutputPriority.DAMAGES);
         return(0);
     }
     hp = hp - damage;
     board.printDebugMessage("Damage taken: " + damage + " on " + getReadableName(), HearthstoneBoard.OutputPriority.DAMAGES);
     performedAction(new DamageTakenAction(), board);
     if (hp <= 0)
     {
         board.addToPendingDeath(this);
         if (hp < 0)
         {
             return(2);
         }
         else
         {
             return(1);
         }
     }
     return(0);
 }
 public void makeUpForReaderError(HearthstoneBoard board)
 {
     foreach (Effect e in effects)
     {
         e.makeUpForReaderError(this, board);
     }
 }
    public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
    {
        board.printDebugMessage("Performing action: bomb deathrattle: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
        BoardSide   opponentBoard = board.getOpponentBoardFromMinion(user);
        List <Card> targets       = new List <Card>();

        for (int i = 0; i < times; i++)
        {
            if (opponentBoard.Count == 0)
            {
                return;
            }
            Card target = opponentBoard.getRandomCardAlive(board);
            if (target == null)
            {
                return;
            }
            user.causeDamageToTarget(target, board, 4);
            targets.Add(target);
        }
        foreach (Card c in targets)
        {
            c.deathCheck(board);
        }
    }
Beispiel #8
0
    public bool doStartOfTurnEffect(HearthstoneBoard board)
    {
        board.printDebugMessage("Doing start of turn effect on board with count " + Count, HearthstoneBoard.OutputPriority.INTENSEDEBUG);
        if (Count == 0)
        {
            return(false);
        }
        int c = 0;

        while (c < Count)
        {
            if (this[c].attackPriority != Card.MAX_PRIORITY)
            {
                this[c].attackPriority = Card.MAX_PRIORITY;
                if (this[c].hasStartofTurnEffect())
                {
                    this[c].performedAction(new StartofCombatAction(), board);
                    board.deathCheck();
                    return(true);
                }
            }
            c++;
        }
        return(false);
    }
Beispiel #9
0
        public static string testZapp(BoardSide b1, BoardSide b2, List <HearthstoneBoard> expected)
        {
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.ZappSlywick));

            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.DragonspawnLieutenant));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.DragonspawnLieutenant));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.BaronRivendare));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.BaronRivendare).setPoisonous(true));

            HearthstoneBoard exp1 = new HearthstoneBoard();

            exp1.p2Board = new BoardSide {
                CardCreatorFactory.createFromName(CardCreatorFactory.Cards.DragonspawnLieutenant), CardCreatorFactory.createFromName(CardCreatorFactory.Cards.BaronRivendare)
            };
            expected.Add(exp1);

            HearthstoneBoard exp2 = new HearthstoneBoard();

            exp2.p2Board = new BoardSide {
                CardCreatorFactory.createFromName(CardCreatorFactory.Cards.DragonspawnLieutenant)
            };
            expected.Add(exp2);

            return("test zapp targeting");
        }
 public override void makeUpForReaderError(Card user, HearthstoneBoard board)
 {
     foreach (Card c in board.getAdjacents(user))
     {
         c.addAttack(-1);
     }
 }
Beispiel #11
0
    public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
    {
        board.printDebugMessage("Performing action: deathrattle dmg bonus: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);

        BoardSide userBoard = board.getBoardFromMinion(user);

        if (userBoard.Count == 1)
        {
            return;
        }


        for (int i = 0; i < times; i++)
        {
            while (true)
            {
                int target = board.getRandomNumber(0, userBoard.Count);
                if (userBoard[target] != user)
                {
                    board.printDebugMessage("Giving damage bonus to " + userBoard[target].getReadableName(), HearthstoneBoard.OutputPriority.INTENSEDEBUG);
                    userBoard[target].addAttack(user.getAttack(board));
                    break;;
                }
            }
        }
    }
Beispiel #12
0
    public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
    {
        board.printDebugMessage("Performing action: deathrattledivine: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);

        BoardSide userBoard = board.getBoardFromMinion(user);

        for (int i = 0; i < times; i++)
        {
            bool stop = true;
            foreach (Card c in userBoard)
            {
                if (c != user && !c.divineShield)
                {
                    board.printDebugMessage("Found minion without divine shield " + c.getReadableName(), HearthstoneBoard.OutputPriority.INTENSEDEBUG);
                    stop = false;
                }
            }
            if (stop)
            {
                return;
            }
            while (true)
            {
                int target = board.getRandomNumber(0, userBoard.Count);
                if (!userBoard[target].divineShield && userBoard[target] != user)
                {
                    board.printDebugMessage("Giving divine shield to " + userBoard[target].getReadableName(), HearthstoneBoard.OutputPriority.INTENSEDEBUG);
                    userBoard[target].setDivineShield(true);
                    break;
                }
            }
        }
    }
 public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     board.printDebugMessage("Performing action: Adjacent + 1 from: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
     foreach (Card c in alwaysUse)
     {
         c.tempAttackBonus += 1;
     }
 }
 public void performedAction(Action a, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     // board.printDebugMessage("Determining if action triggers effect (" +a.getName()+") on card: "+user.getReadableName(), HearthstoneBoard.OutputPriority.ALL);
     if (triggerFromAction(a))
     {
         doAction(a, user, board, alwaysUse);
     }
 }
 public bool compare(HearthstoneBoard board)
 {
     if (p1Board.Compare(board.p1Board, this, board) && p2Board.Compare(board.p2Board, this, board))
     {
         return(true);
     }
     return(false);
 }
 public void performedAction(Action a, HearthstoneBoard hearthstoneBoard)
 {
     hearthstoneBoard.printDebugMessage("Received action " + a.getName() + " on " + this.getReadableName(), HearthstoneBoard.OutputPriority.COMMUNICATION);
     foreach (Effect e in effects)
     {
         e.performedAction(a, this, hearthstoneBoard, null);
     }
 }
 public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     board.printDebugMessage("Performing action: random dr summon: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
     for (int i = 0; i < times; i++)
     {
         board.addNewMinionToBoard(board.getPlayerFromMinion(user), getRandomCard(board).setAttackPriority(user.attackPriority), board.getPositionFromMinion(user) + i, true);
     }
 }
Beispiel #18
0
 public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     board.printDebugMessage("Performing action: deathrattlebuff: " + user.getReadableName(), HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
     foreach (Card c in board.getBoardFromMinion(user))
     {
         c.addStats(buff, buff);
     }
 }
 public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     board.printDebugMessage("Performing action: deathrattlesummon: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
     for (int i = 0; i < count; i++)
     {
         board.addNewMinionToBoard(board.getPlayerFromMinion(user), CardCreatorFactory.createFromName(summon).setAttackPriority(user.attackPriority), board.getPositionFromMinion(user) + i, true);
     }
 }
 public void deathCheck(HearthstoneBoard board)
 {
     board.printDebugMessage("Performing death check on " + getReadableName(), HearthstoneBoard.OutputPriority.COMMUNICATION);
     if (!isAlive() && board.containsCard(this))
     {
         this.performedAction(new DeadAction(), board);
         board.killOf(this);
     }
 }
 public void performAdjacantEffects(Card middle, HearthstoneBoard hearthstoneBoard)
 {
     foreach (Effect e in effects)
     {
         e.performedAction(new AdjacentAction(), this, hearthstoneBoard, new List <Card> {
             middle
         });
     }
 }
    public void performAttack(Card target, HearthstoneBoard board)
    {
        board.printDebugMessage("attacker: " + this.getReadableName() + " defender: " + target.getReadableName(), HearthstoneBoard.OutputPriority.ATTACKERS);
        if (board.turnbyturn)
        {
            Console.WriteLine("--------------------------------------");
            Console.WriteLine("Attacker: " + this.getReadableName());
            Console.WriteLine("Defender: " + target.getReadableName());
            Console.ReadLine();
        }
        if (board.stopFlag)
        {
            board.attacker         = this;
            board.defender         = target;
            board.finishedWorkFlag = true;
            while (board.stopFlag)
            {
                Thread.Sleep(100);
            }
            board.finishedWorkFlag = false;
            board.stopFlag         = true;
        }
        this.performedAction(new AttackingAction(target), board);
        int returnAttack = target.poisonous ? 9999999 : target.getAttack(board);

        //target.dealDamage(getAttack(board), board);
        causeDamageToTarget(target, board, getAttack(board));
        if (this.dealDamage(returnAttack, board) > 0)
        {
            foreach (Card c in board.getBoardFromMinion(target))
            {
                c.performedAction(new GotKillAction(target), board);
            }
        }


        board.deathCheck();
        //target.deathCheck(board);
        //this.deathCheck(board);



        attackPriority = Card.MAX_PRIORITY;
        board.printDebugMessage("attack perform finished from " + this.getReadableName() + " to " + target.getReadableName(), HearthstoneBoard.OutputPriority.ATTACKERS);
        if (board.printPriority >= HearthstoneBoard.OutputPriority.ATTACKERS)
        {
            board.printState();
        }

        if (board.turnbyturn)
        {
            Console.WriteLine("--------------------------------------");
            board.printState();
            Console.ReadLine();
        }
    }
Beispiel #23
0
        public static string testMinibotDivine(BoardSide b1, BoardSide b2, List <HearthstoneBoard> expected)
        {
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.ShieldedMinibot));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.VulgarHomunculus));

            HearthstoneBoard exp1 = new HearthstoneBoard();

            expected.Add(exp1);
            return("test minibot divine");
        }
Beispiel #24
0
        public static string testCase2(BoardSide b1, BoardSide b2, List <HearthstoneBoard> expected)
        {
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.Mecharoo));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.DireWolfAlpha));

            HearthstoneBoard exp1 = new HearthstoneBoard();

            expected.Add(exp1);
            return("Test 1");
        }
 public override void makeUpForReaderError(Card user, HearthstoneBoard board)
 {
     foreach (Card c in board.getBoardFromMinion(user))
     {
         if (c.typeMatches(type) && c != user)
         {
             c.addAttack(-dmg);
         }
     }
 }
Beispiel #26
0
 public bool hasAvailableAttackers(HearthstoneBoard board)
 {
     foreach (Card c in this)
     {
         if (c.getAttack(board) > 0)
         {
             return(true);
         }
     }
     return(false);
 }
 public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
 {
     board.printDebugMessage("Performing action: Mal'ganis hacky SoT effect " + user.getReadableName(), HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
     foreach (Card c in board.getBoardFromMinion(user))
     {
         if (c != user && c.typeMatches(Card.Type.Demon))
         {
             c.addStats(buff, buff);
         }
     }
 }
Beispiel #28
0
    public override void doAction(Action cause, Card user, HearthstoneBoard board, List <Card> alwaysUse)
    {
        board.printDebugMessage("Performing action: cleave attack: " + user, HearthstoneBoard.OutputPriority.EFFECTTRIGGERS);
        Card target = ((AttackingAction)cause).target;
        var  adj    = board.getAdjacents(target);

        foreach (Card c in adj)
        {
            user.causeDamageToTarget(c, board, user.getAttack(board));
        }
    }
Beispiel #29
0
        public static string testJuggler(BoardSide b1, BoardSide b2, List <HearthstoneBoard> expected)
        {
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.Voidwalker));
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.SoulJuggler));

            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.KaboomBot).setStats(3, 3));

            HearthstoneBoard exp1 = new HearthstoneBoard();

            expected.Add(exp1);
            return("test soul juggler");
        }
Beispiel #30
0
        public static string testPoison(BoardSide b1, BoardSide b2, List <HearthstoneBoard> expected)
        {
            b1.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.Maexxna));
            b2.Add(CardCreatorFactory.createFromName(CardCreatorFactory.Cards.Maexxna));



            HearthstoneBoard exp1 = new HearthstoneBoard();

            expected.Add(exp1);
            return("test poison");
        }