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)); }
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)); }