protected ButtonRuleSet GenerateButtonRuleSet(bool useDefault = false)
        {
            BuildQueryLists();
            var buttonRuleSet = new ButtonRuleSet();

            while (buttonRuleSet.RuleList.Count < MaxInitialRules && PrimaryQueryList.Count > 0)
            {
                var baseQuery = PopQueryFromList(PrimaryQueryList);
                var num       = rand.Next(2);
                if (num == 0)
                {
                    buttonRuleSet.RuleList.Add(CreateRule(baseQuery, null, false));
                }
                for (var i = 0; i < num; i++)
                {
                    buttonRuleSet.RuleList.Add(CreateRule(baseQuery, PopQueryFromList(SecondaryQueryList), false));
                }
            }
            var rule = new Rule();

            rule.Queries.Add(OtherwiseQuery());
            rule.Solution     = ButtonSolutions.Hold;
            rule.SolutionArgs = new Dictionary <string, object>();
            buttonRuleSet.RuleList.Add(rule);
            while (buttonRuleSet.HoldRuleList.Count < MaxHoldRules && IndicatorColorQueryList.Count > 0)
            {
                var baseQuery2 = PopQueryFromList(IndicatorColorQueryList);
                buttonRuleSet.HoldRuleList.Add(CreateRule(baseQuery2, null, true));
            }
            buttonRuleSet.HoldRuleList.Add(CreateRule(IndicatorOtherwiseQuery(), null, true));
            RuleSet = buttonRuleSet;
            return(buttonRuleSet);
        }
        protected ButtonRuleSet GenerateButtonRuleSet(bool useDefault = false)
        {
            var buttonRuleSet = new ButtonRuleSet();

            if (useDefault)
            {
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Hold, mkQuery(QueryableButtonProperty.IsButtonColor, "color", ButtonColor.blue), mkQuery(QueryableButtonProperty.IsButtonInstruction, "instruction", ButtonInstruction.Abort)));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Press, mkQuery(QueryableProperty.MoreThanXBatteries, "batteryCount", 1), mkQuery(QueryableButtonProperty.IsButtonInstruction, "instruction", ButtonInstruction.Detonate)));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Hold, mkQuery(QueryableButtonProperty.IsButtonColor, "color", ButtonColor.white), mkQuery(QueryableProperty.IndicatorXLit, "label", "CAR")));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Press, mkQuery(QueryableProperty.MoreThanXBatteries, "batteryCount", 2), mkQuery(QueryableProperty.IndicatorXLit, "label", "FRK")));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Hold, mkQuery(QueryableButtonProperty.IsButtonColor, "color", ButtonColor.yellow)));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Press, mkQuery(QueryableButtonProperty.IsButtonColor, "color", ButtonColor.red), mkQuery(QueryableButtonProperty.IsButtonInstruction, "instruction", ButtonInstruction.Hold)));
                buttonRuleSet.RuleList.Add(mkRule(ButtonSolutions.Hold, mkQuery(QueryableButtonProperty.ButtonOtherwise)));

                buttonRuleSet.HoldRuleList.Add(mkRule(ButtonSolutions.ReleaseOnTimerText("4"), mkQuery(QueryableButtonProperty.IsIndicatorColor, "color", BigButtonLEDColor.Blue)));
                buttonRuleSet.HoldRuleList.Add(mkRule(ButtonSolutions.ReleaseOnTimerText("1"), mkQuery(QueryableButtonProperty.IsIndicatorColor, "color", BigButtonLEDColor.White)));
                buttonRuleSet.HoldRuleList.Add(mkRule(ButtonSolutions.ReleaseOnTimerText("5"), mkQuery(QueryableButtonProperty.IsIndicatorColor, "color", BigButtonLEDColor.Yellow)));
                buttonRuleSet.HoldRuleList.Add(mkRule(ButtonSolutions.ReleaseOnTimerText("1"), mkQuery(QueryableButtonProperty.IndicatorOtherwise)));

                return(buttonRuleSet);
            }

            BuildQueryLists();
            while (buttonRuleSet.RuleList.Count < MaxInitialRules && PrimaryQueryList.Count > 0)
            {
                var baseQuery = PopQueryFromList(PrimaryQueryList);
                var num       = rand.Next(2);
                if (num == 0)
                {
                    buttonRuleSet.RuleList.Add(CreateRule(baseQuery, null, false));
                }
                for (var i = 0; i < num; i++)
                {
                    buttonRuleSet.RuleList.Add(CreateRule(baseQuery, PopQueryFromList(SecondaryQueryList), false));
                }
            }
            var rule = new Rule();

            rule.Queries.Add(OtherwiseQuery());
            rule.Solution     = ButtonSolutions.Hold;
            rule.SolutionArgs = new Dictionary <string, object>();
            buttonRuleSet.RuleList.Add(rule);
            while (buttonRuleSet.HoldRuleList.Count < MaxHoldRules && IndicatorColorQueryList.Count > 0)
            {
                var baseQuery2 = PopQueryFromList(IndicatorColorQueryList);
                buttonRuleSet.HoldRuleList.Add(CreateRule(baseQuery2, null, true));
            }
            buttonRuleSet.HoldRuleList.Add(CreateRule(IndicatorOtherwiseQuery(), null, true));
            RuleSet = buttonRuleSet;
            return(buttonRuleSet);
        }
    protected override IEnumerator ForcedSolveIEnumerator()
    {
        yield return(null);

        ButtonRuleSet ruleset = RuleManager.Instance.ButtonRuleSet;

        ruleset.HoldRuleList.Insert(0, ForcedSolveRule());
        ruleset.RuleList.Insert(0, ForcedSolveRule());
        if (!_held)
        {
            yield return(DoInteractionClick(_button));
        }
        else
        {
            DoInteractionEnd(_button);
            _held = false;
        }
        ruleset.HoldRuleList.RemoveAt(0);
        ruleset.RuleList.RemoveAt(0);
    }