public OptionNode(OptionNode parent, Game game, int playerId, PlayerTask playerTask, IScore scoring)
        {
            _parent    = parent;
            _game      = game.Clone(); // create clone
            _playerId  = playerId;
            PlayerTask = playerTask;
            Scoring    = scoring;

            if (!IsRoot)
            {
                Execute();
            }
        }
        public void OptionsWithOnlyAttacks(ref Dictionary <string, OptionNode> optionNodes)
        {
            List <PlayerTask> options = OptionsOnlyMinionAttacksAndHeroAttacks(_game, _playerId);

            foreach (PlayerTask option in options)
            {
                var optionNode = new OptionNode(this, _game, _playerId, option, Scoring);
                if (!optionNodes.ContainsKey(optionNode.Hash))
                {
                    optionNodes.Add(optionNode.Hash, optionNode);
                }
            }
        }
        public void Options(ref Dictionary <string, OptionNode> optionNodes)
        {
            List <PlayerTask> options = _game.ControllerById(_playerId).Options(!_isOpponentTurn);

            options = options.OrderBy(p => Util.Random.Next()).ToList();
            foreach (PlayerTask option in options)
            {
                var optionNode = new OptionNode(this, _game, _playerId, option, Scoring);
                if (!optionNodes.ContainsKey(optionNode.Hash))
                {
                    optionNodes.Add(optionNode.Hash, optionNode);
                }
            }
        }