diff --git a/Options.py b/Options.py index 3e3137322f..1087daf17f 100644 --- a/Options.py +++ b/Options.py @@ -688,6 +688,12 @@ class Range(NumericOption): range_start = 0 range_end = 1 + _RANDOM_OPTS = [ + "random", "random-low", "random-middle", "random-high", + "random-range-low--", "random-range-middle--", + "random-range-high--", "random-range--", + ] + def __init__(self, value: int): if value < self.range_start: raise Exception(f"{value} is lower than minimum {self.range_start} for option {self.__class__.__name__}") @@ -713,9 +719,26 @@ class Range(NumericOption): # these are the conditions where "true" and "false" make sense if text == "true": return cls.from_any(cls.default) - else: # "false" - return cls(0) - return cls(int(text)) + # "false" + return cls(0) + + try: + num = int(text) + except ValueError: + # text is not a number + # Handle conditionally acceptable values here rather than in the f-string + default = "" + truefalse = "" + if hasattr(cls, "default"): + default = ", default" + if cls.range_start == 0 and cls.default != 0: + truefalse = ", \"true\", \"false\"" + raise Exception(f"Invalid range value {text!r}. Acceptable values are: " + f"{default}, high, low{truefalse}, " + f"{', '.join(cls._RANDOM_OPTS)}.") + + return cls(num) + @classmethod def weighted_range(cls, text) -> Range: @@ -731,9 +754,7 @@ class Range(NumericOption): return cls(random.randint(cls.range_start, cls.range_end)) else: raise Exception(f"random text \"{text}\" did not resolve to a recognized pattern. " - f"Acceptable values are: random, random-high, random-middle, random-low, " - f"random-range-low--, random-range-middle--, " - f"random-range-high--, or random-range--.") + f"Acceptable values are: {', '.join(cls._RANDOM_OPTS)}.") @classmethod def custom_range(cls, text) -> Range: