private Requirement ProcessReqs(RandoConfigReq config)
 {
     return(this.ProcessReqs(config, null, false));
 }
        private Requirement ProcessReqs(RandoConfigReq config, Hole matchHole = null, bool isOut = false)
        {
            if (matchHole != null)
            {
                if (matchHole.Kind == HoleKind.None)
                {
                    return(new Impossible());
                }
                if (isOut && (matchHole.Kind == HoleKind.In || matchHole.Kind == HoleKind.Unknown))
                {
                    return(new Impossible());
                }
                if (!isOut && matchHole.Kind == HoleKind.Out)
                {
                    return(new Impossible());
                }
                if (config == null)
                {
                    return(new Possible());
                }
            }
            if (config == null)
            {
                return(new Impossible());
            }

            var conjunction = new List <Requirement>();

            if (config.And != null)
            {
                var children = new List <Requirement>();
                foreach (var childconfig in config.And)
                {
                    children.Add(this.ProcessReqs(childconfig));
                }
                conjunction.Add(new Conjunction(children));
            }

            if (config.Or != null)
            {
                var children = new List <Requirement>();
                foreach (var childconfig in config.Or)
                {
                    children.Add(this.ProcessReqs(childconfig));
                }
                conjunction.Add(new Disjunction(children));
            }

            if (config.Dashes != null)
            {
                conjunction.Add(new DashRequirement(config.Dashes.Value));
            }

            // not nullable
            conjunction.Add(new SkillRequirement(config.Difficulty));

            if (config.Key)
            {
                if (config.KeyholeID == null)
                {
                    throw new Exception("Config error: Key: true without KeyholeID");
                }
                conjunction.Add(new KeyRequirement(config.KeyholeID.Value));
            }

            if (conjunction.Count == 0)
            {
                throw new Exception("this should be unreachable");
            }
            else if (conjunction.Count == 1)
            {
                return(conjunction[0]);
            }
            return(new Conjunction(conjunction));
        }
Example #3
0
        private Requirement ProcessReqs(RandoConfigReq config, Hole matchHole, bool isOut)
        {
            if (matchHole != null)
            {
                if (matchHole.Kind == HoleKind.None)
                {
                    return(new Impossible());
                }
                if (isOut && (matchHole.Kind == HoleKind.In || matchHole.Kind == HoleKind.Unknown))
                {
                    return(new Impossible());
                }
                if (!isOut && matchHole.Kind == HoleKind.Out)
                {
                    return(new Impossible());
                }
                if (config == null)
                {
                    return(new Possible());
                }
            }
            if (config == null)
            {
                return(new Impossible());
            }

            var conjunction = new List <Requirement>();

            if (config.And != null)
            {
                var children = new List <Requirement>();
                foreach (var childconfig in config.And)
                {
                    children.Add(this.ProcessReqs(childconfig));
                }
                conjunction.Add(new Conjunction(children));
            }

            if (config.Or != null)
            {
                var children = new List <Requirement>();
                foreach (var childconfig in config.Or)
                {
                    children.Add(this.ProcessReqs(childconfig));
                }
                conjunction.Add(new Disjunction(children));
            }

            if (config.Dashes != null)
            {
                conjunction.Add(new DashRequirement(config.Dashes.Value));
            }

            if (config.Flag != null)
            {
                var name = config.Flag;
                var val  = true;
                if (name.Contains(":"))
                {
                    var split = name.Split(':');
                    name = split[0];
                    var v = split[1].ToLower();
                    val = v == "on" || v == "set" || v == "true" || v == "yes";
                }
                conjunction.Add(new FlagRequirement(name, val));
            }

            // not nullable
            conjunction.Add(new SkillRequirement(config.Difficulty));

            if (config.Key)
            {
                if (config.KeyholeID == null)
                {
                    throw new Exception("Config error: Key: true without KeyholeID");
                }
                conjunction.Add(new KeyRequirement(config.KeyholeID.Value));
            }

            if (conjunction.Count == 0)
            {
                throw new Exception("this should be unreachable");
            }
            else if (conjunction.Count == 1)
            {
                return(conjunction[0]);
            }
            return(new Conjunction(conjunction));
        }