diff --git a/nml/actions/action0.py b/nml/actions/action0.py index be0249100..ca576c5c1 100644 --- a/nml/actions/action0.py +++ b/nml/actions/action0.py @@ -458,7 +458,7 @@ def get_property_info_list(feature, name): if isinstance(name, expression.Identifier): prop_name = name.value if prop_name not in properties[feature]: - raise generic.ScriptError("Unknown property name: " + prop_name, name.pos) + raise generic.ScriptError(f"Unknown property name: {prop_name}", name.pos) prop_info_list = properties[feature][prop_name] if not isinstance(prop_info_list, list): prop_info_list = [prop_info_list] @@ -470,7 +470,7 @@ def get_property_info_list(feature, name): if len(prop_info_list) == 1 and "num" in prop_info_list[0] and prop_info_list[0]["num"] == name.value: break else: - raise generic.ScriptError("Unknown property number: " + str(name), name.pos) + raise generic.ScriptError(f"Unknown property number: {str(name)}", name.pos) else: raise AssertionError() @@ -635,7 +635,7 @@ def apply_threshold(value): elif isinstance(value, expression.String): if "string" not in prop_info: raise generic.ScriptError( - "String used as value for non-string property: " + str(prop_info["num"]), value.pos + f"String used as value for non-string property: {str(prop_info["num"])}", value.pos ) string_range = apply_threshold(prop_info["string"]) stringid, string_actions = action4.get_string_action4s(feature, string_range, value, id) diff --git a/nml/actions/action0properties.py b/nml/actions/action0properties.py index e7aa8b7c9..b178f277c 100644 --- a/nml/actions/action0properties.py +++ b/nml/actions/action0properties.py @@ -237,7 +237,7 @@ def animation_info(value, loop_bit=8, max_frame=253): raise generic.ScriptError("First field of the animation_info array must be either 0 or 1", value.values[0].pos) if frames < 1 or frames > max_frame: raise generic.ScriptError( - "Second field of the animation_info array must be between 1 and " + str(max_frame), value.values[1].pos + f"Second field of the animation_info array must be between 1 and {str(max_frame)}", value.values[1].pos ) return ConstantNumeric((looping << loop_bit) + frames - 1) @@ -1526,7 +1526,7 @@ def get_size(self): def label_list(value, prop_num, description): if not isinstance(value, Array): - raise generic.ScriptError(description + " list must be an array of literal strings", value.pos) + raise generic.ScriptError(f"{description} list must be an array of literal strings", value.pos) return [LabelListProp(prop_num, value.values)] @@ -1642,7 +1642,7 @@ def write(self, file): for item in self.items: val = item.reduce_constant().value if val > 0xFF or val < 0: - raise generic.ScriptError(self.description + " items must be bytes", self.pos) + raise generic.ScriptError(f"{self.description} items must be bytes", self.pos) file.print_byte(val) file.newline() @@ -1652,7 +1652,7 @@ def get_size(self): def byte_sequence_list(value, prop_num, description, expected_count): if not isinstance(value, Array) or len(value.values) != expected_count: - raise generic.ScriptError(description + " must be an array of " + str(expected_count) + " bytes", value.pos) + raise generic.ScriptError(f"{description} must be an array of {str(expected_count)} bytes", value.pos) return [ByteSequenceProp(prop_num, value.values, description, value.pos)] diff --git a/nml/actions/action2layout.py b/nml/actions/action2layout.py index 1371e6340..656d1e008 100644 --- a/nml/actions/action2layout.py +++ b/nml/actions/action2layout.py @@ -257,7 +257,7 @@ def _validate_offset(self, offset, spriteset, pos): pos, ) else: - raise generic.ScriptError("Expected 0 or 1 parameter, got " + str(len(offset)), pos) + raise generic.ScriptError(f"Expected 0 or 1 parameter, got {str(len(offset))}", pos) return offset def resolve_spritegroup_ref(self, sg_ref): @@ -355,10 +355,10 @@ def _validate_always_draw(self, name, value): def _validate_bounding_box(self, name, value): if self.type == Action2LayoutSpriteType.GROUND: - raise generic.ScriptError(name + " can not be set for ground sprites", value.pos) + raise generic.ScriptError(f"{name} can not be set for ground sprites", value.pos) elif self.type == Action2LayoutSpriteType.CHILD: if name not in ("xoffset", "yoffset"): - raise generic.ScriptError(name + " can not be set for child sprites", value.pos) + raise generic.ScriptError(f"{name} can not be set for child sprites", value.pos) if isinstance(value, expression.ConstantNumeric): generic.check_range(value.value, 0, 255, name, value.pos) return value diff --git a/nml/actions/action5.py b/nml/actions/action5.py index 4c16955d1..3907148d3 100644 --- a/nml/actions/action5.py +++ b/nml/actions/action5.py @@ -94,7 +94,7 @@ def parse_action5(replaces): num_sprites = len(real_sprite_list) if replaces.type.value not in action5_table: - raise generic.ScriptError(replaces.type.value + " is not a valid sprite replacement type", replaces.type.pos) + raise generic.ScriptError(f"{replaces.type.value} is not a valid sprite replacement type", replaces.type.pos) type_id, num_required, block_type = action5_table[replaces.type.value] offset = None diff --git a/nml/actions/real_sprite.py b/nml/actions/real_sprite.py index 5cb016965..45af596b9 100644 --- a/nml/actions/real_sprite.py +++ b/nml/actions/real_sprite.py @@ -422,7 +422,7 @@ def debug_print(self, indentation): def get_labels(self): # Load labels from the template definition if self.name.value not in sprite_template_map: - raise generic.ScriptError("Encountered unknown template identifier: " + self.name.value, self.name.pos) + raise generic.ScriptError(f"Encountered unknown template identifier: {self.name.value}", self.name.pos) labels, offset = sprite_template_map[self.name.value].get_labels() # Add (possibly) label applied to ourselves if self.label is not None: @@ -435,14 +435,13 @@ def get_labels(self): def expand(self, default_file, default_mask_file, poslist, parameters): if self.name.value not in sprite_template_map: - raise generic.ScriptError("Encountered unknown template identifier: " + self.name.value, self.name.pos) + raise generic.ScriptError(f"Encountered unknown template identifier: {self.name.value}", self.name.pos) template = sprite_template_map[self.name.value] if len(self.param_list) != len(template.param_list): raise generic.ScriptError( - "Incorrect number of template arguments. Expected " - + str(len(template.param_list)) - + ", got " - + str(len(self.param_list)), + "Incorrect number of template arguments. Expected {}, got {}".format( + str(len(template.param_list)), str(len(self.param_list)) + ), self.pos, ) param_dict = {} diff --git a/nml/ast/alt_sprites.py b/nml/ast/alt_sprites.py index a07d17c17..b52ac5f39 100644 --- a/nml/ast/alt_sprites.py +++ b/nml/ast/alt_sprites.py @@ -47,7 +47,7 @@ def __init__(self, param_list, sprite_list, pos): base_statement.BaseStatement.__init__(self, "alt_sprites-block", pos) if not (3 <= len(param_list) <= 5): raise generic.ScriptError( - "alternative_sprites-block requires 3 or 4 parameters, encountered " + str(len(param_list)), pos + f"alternative_sprites-block requires 3 or 4 parameters, encountered f{str(len(param_list))}", pos ) self.name = param_list[0] diff --git a/nml/ast/error.py b/nml/ast/error.py index 42cb86880..2490490ee 100644 --- a/nml/ast/error.py +++ b/nml/ast/error.py @@ -46,7 +46,7 @@ def __init__(self, param_list, pos): base_statement.BaseStatement.__init__(self, "error()", pos) if not 2 <= len(param_list) <= 5: raise generic.ScriptError( - "'error' expects between 2 and 5 parameters, got " + str(len(param_list)), self.pos + f"'error' expects between 2 and 5 parameters, got {str(len(param_list))}", self.pos ) self.severity = param_list[0] self.msg = param_list[1] diff --git a/nml/ast/font.py b/nml/ast/font.py index 12a3b642c..e33248848 100644 --- a/nml/ast/font.py +++ b/nml/ast/font.py @@ -41,7 +41,7 @@ def __init__(self, param_list, sprite_list, name, pos): sprite_container.SpriteContainer.__init__(self, "font_glyph-block", name) if not (2 <= len(param_list) <= 3): raise generic.ScriptError( - "font_glyph-block requires 2 or 3 parameters, encountered " + str(len(param_list)), pos + f"font_glyph-block requires 2 or 3 parameters, encountered {str(len(param_list))}", pos ) self.font_size = param_list[0] self.base_char = param_list[1] diff --git a/nml/ast/grf.py b/nml/ast/grf.py index 3440b1fd4..0acb9fca8 100644 --- a/nml/ast/grf.py +++ b/nml/ast/grf.py @@ -107,7 +107,7 @@ def __init__(self, alist, pos): elif assignment.name.value == "min_compatible_version": self.min_compatible_version = assignment.value else: - raise generic.ScriptError("Unknown item in GRF-block: " + str(assignment.name), assignment.name.pos) + raise generic.ScriptError(f"Unknown item in GRF-block: {str(assignment.name)}", assignment.name.pos) def register_names(self): generic.OnlyOnce.enforce(self, "GRF-block") @@ -301,7 +301,7 @@ def set_property(self, name, value): if self.type == "bool" and self.def_val.value != 0 and self.def_val.value != 1: raise generic.ScriptError("setting-def_value must be either 0 or 1 for 'bool' settings", value.pos) else: - raise generic.ScriptError("Unknown setting-property " + name, value.pos) + raise generic.ScriptError(f"Unknown setting-property {name}", value.pos) class ParameterDescription: diff --git a/nml/ast/replace.py b/nml/ast/replace.py index 71c723f4b..ac9451f38 100644 --- a/nml/ast/replace.py +++ b/nml/ast/replace.py @@ -39,7 +39,7 @@ def __init__(self, param_list, sprite_list, name, pos): num_params = len(param_list) if not (1 <= num_params <= 2): - raise generic.ScriptError("replace-block requires 1 or 2 parameters, encountered " + str(num_params), pos) + raise generic.ScriptError(f"replace-block requires 1 or 2 parameters, encountered {str(num_params)}", pos) self.start_id = param_list[0] if num_params >= 2: self.image_file = param_list[1].reduce() @@ -112,7 +112,7 @@ def __init__(self, param_list, sprite_list, name, pos): num_params = len(param_list) if not (1 <= num_params <= 3): raise generic.ScriptError( - "replacenew-block requires 1 to 3 parameters, encountered " + str(num_params), pos + f"replacenew-block requires 1 to 3 parameters, encountered {str(num_params)}", pos ) self.type = param_list[0] diff --git a/nml/ast/spriteblock.py b/nml/ast/spriteblock.py index ad106c402..2c0d2a241 100644 --- a/nml/ast/spriteblock.py +++ b/nml/ast/spriteblock.py @@ -36,7 +36,7 @@ def pre_process(self): ) elif sprite.name.value not in real_sprite.sprite_template_map: raise generic.ScriptError( - "Encountered unknown template identifier: " + sprite.name.value, sprite.pos + f"Encountered unknown template identifier: {sprite.name.value}", sprite.pos ) # Register template if self.name.value not in real_sprite.sprite_template_map: @@ -88,7 +88,7 @@ class SpriteSet(spriteset_base_class, sprite_container.SpriteContainer): def __init__(self, param_list, sprite_list, pos): base_statement.BaseStatement.__init__(self, "spriteset", pos, False, False) if not (1 <= len(param_list) <= 5): - raise generic.ScriptError("Spriteset requires 1 to 5 parameters, encountered " + str(len(param_list)), pos) + raise generic.ScriptError(f"Spriteset requires 1 to 5 parameters, encountered {str(len(param_list))}", pos) name = param_list[0] if not isinstance(name, expression.Identifier): raise generic.ScriptError("Spriteset parameter 1 'name' should be an identifier", name.pos) diff --git a/nml/ast/switch.py b/nml/ast/switch.py index 0bacd0b5c..9549080b9 100644 --- a/nml/ast/switch.py +++ b/nml/ast/switch.py @@ -28,7 +28,7 @@ def __init__(self, param_list, body, pos): base_statement.BaseStatement.__init__(self, "switch-block", pos, False, False) if len(param_list) < 4: raise generic.ScriptError( - "Switch-block requires at least 4 parameters, encountered " + str(len(param_list)), pos + f"Switch-block requires at least 4 parameters, encountered {str(len(param_list))}", pos ) if not isinstance(param_list[1], expression.Identifier): raise generic.ScriptError( @@ -380,7 +380,7 @@ def pre_process(self): self.triggers = self.triggers.reduce_constant(global_constants.const_list) if not (0 <= self.triggers.value <= 255): raise generic.ScriptError( - "random_switch parameter 4 'triggers' out of range 0..255, encountered " + str(self.triggers.value), + f"random_switch parameter 4 'triggers' out of range 0..255, encountered {str(self.triggers.value)}", self.triggers.pos, ) diff --git a/nml/expression/cargo.py b/nml/expression/cargo.py index 4530609b7..e6259dd1f 100644 --- a/nml/expression/cargo.py +++ b/nml/expression/cargo.py @@ -29,7 +29,7 @@ def cargolabel(self): for label, number in global_constants.cargo_numbers.items(): if number == self.cargotype: return label - raise AssertionError("Cargo expression with unregistered cargotype at " + str(self.pos)) + raise AssertionError(f"Cargo expression with unregistered cargotype at {str(self.pos)}") def debug_print(self, indentation): if self.value is None: diff --git a/nml/expression/functioncall.py b/nml/expression/functioncall.py index c8a4ec4af..27b318196 100644 --- a/nml/expression/functioncall.py +++ b/nml/expression/functioncall.py @@ -244,7 +244,7 @@ def builtin_day_of_year(name, args, pos): @return Day of the year, assuming February has 28 days. """ if len(args) != 2: - raise generic.ScriptError(name + "() must have a month and a day parameter", pos) + raise generic.ScriptError(f"{name}() must have a month and a day parameter", pos) month = args[0].reduce() if not isinstance(month, ConstantNumeric): @@ -275,21 +275,21 @@ def builtin_storage(name, args, pos): @builtin def builtin_UCMP(name, args, pos): if len(args) != 2: - raise generic.ScriptError(name + "() must have exactly two parameters", pos) + raise generic.ScriptError(f"{name}() must have exactly two parameters", pos) return nmlop.VACT2_UCMP(args[0], args[1], pos) @builtin def builtin_CMP(name, args, pos): if len(args) != 2: - raise generic.ScriptError(name + "() must have exactly two parameters", pos) + raise generic.ScriptError(f"{name}() must have exactly two parameters", pos) return nmlop.VACT2_CMP(args[0], args[1], pos) @builtin def builtin_rotate(name, args, pos): if len(args) != 2: - raise generic.ScriptError(name + "() must have exactly two parameters", pos) + raise generic.ScriptError(f"{name}() must have exactly two parameters", pos) return nmlop.ROT_RIGHT(args[0], args[1], pos) @@ -306,7 +306,7 @@ def builtin_hasbit(name, args, pos): @return C{1} if and only if C{value} has bit C{bit_num} set, C{0} otherwise. """ if len(args) != 2: - raise generic.ScriptError(name + "() must have exactly two parameters", pos) + raise generic.ScriptError(f"{name}() must have exactly two parameters", pos) return nmlop.HASBIT(args[0], args[1], pos) @@ -319,7 +319,7 @@ def builtin_getbits(name, args, pos): that is (C{value} >> C{first}) & (1 << C{amount} - 1) """ if len(args) != 3: - raise generic.ScriptError(name + "() must have exactly three parameters", pos) + raise generic.ScriptError(f"{name}() must have exactly three parameters", pos) # getbits(value, first, amount) = (value >> first) & ((0xFFFFFFFF << amount) ^ 0xFFFFFFFF) part1 = nmlop.SHIFTU_RIGHT(args[0], args[1], pos) @@ -340,19 +340,19 @@ def builtin_version_openttd(name, args, pos): @return The version information encoded in a double-word. """ if len(args) < 2: - raise generic.ScriptError(name + "() must have at least 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have at least 2 parameters", pos) major = args[0].reduce_constant().value minor = args[1].reduce_constant().value if major >= 12: if len(args) != 2: - raise generic.ScriptError(name + "() must have at exactly 2 parameters for OpenTTD >= 12.0", pos) + raise generic.ScriptError(f"{name}() must have at exactly 2 parameters for OpenTTD >= 12.0", pos) return ConstantNumeric(((16 + major) << 24) | (minor << 20)) else: if len(args) > 4: - raise generic.ScriptError(name + "() must have at most 4 parameters", pos) + raise generic.ScriptError(f"{name}() must have at most 4 parameters", pos) revision = args[2].reduce_constant().value if len(args) >= 3 else 0 build = args[3].reduce_constant().value if len(args) >= 4 else 0x80000 @@ -374,7 +374,7 @@ def builtin_typelabel_available(name, args, pos): }[name] if len(args) != 1: - raise generic.ScriptError(name + "() must have exactly 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have exactly 1 parameter", pos) label = args[0].reduce() return SpecialCheck(op, 0, (0, 1), parse_string_to_dword(label), "{}({})".format(name, label), pos=args[0].pos) @@ -404,7 +404,7 @@ def builtin_grf_status(name, args, pos): string = "{}({}, {})".format(name, grfid, mask) varsize = 8 else: - raise generic.ScriptError(name + "() must have 1 or 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have 1 or 2 parameters", pos) return SpecialCheck(op, 0x88, results, parse_string_to_dword(grfid), string, varsize, mask, args[0].pos) @@ -421,7 +421,7 @@ def builtin_visual_effect_and_powered(name, args, pos): """ arg_len = 2 if name == "visual_effect" else 3 if len(args) != arg_len: - raise generic.ScriptError(name + "() must have {:d} parameters".format(arg_len), pos) + raise generic.ScriptError(f"{name}() must have {arg_len:d} parameters", pos) effect = args[0].reduce_constant(global_constants.const_list).value offset = nmlop.ADD(args[1], 8).reduce_constant().value generic.check_range(offset, 0, 0x0F, "offset in function " + name, pos) @@ -448,7 +448,7 @@ def builtin_create_effect(name, args, pos): """ if len(args) != 4: - raise generic.ScriptError(name + "() must have 4 parameters", pos) + raise generic.ScriptError(f"{name}() must have 4 parameters", pos) sprite = args[0].reduce_constant(global_constants.const_list).value offset1 = args[1].reduce_constant().value @@ -466,7 +466,7 @@ def builtin_create_effect(name, args, pos): @builtin def builtin_str2number(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) return ConstantNumeric(parse_string_to_dword(args[0])) @@ -491,7 +491,7 @@ def builtin_resolve_typelabel(name, args, pos, table_name=None): table_name = "cargo" # NML syntax uses "cargotable" and "railtypetable" if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) if not isinstance(args[0], StringLiteral) or args[0].value not in table: raise generic.ScriptError( "Parameter for {}() must be a string literal that is also in your {} table".format(name, table_name), pos @@ -502,7 +502,7 @@ def builtin_resolve_typelabel(name, args, pos, table_name=None): @builtin def builtin_reserve_sprites(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) count = args[0].reduce_constant() return GRMOp(nmlop.GRM_RESERVE, 0x08, count.value, lambda x: "{}({:d})".format(name, count.value), pos) @@ -515,7 +515,7 @@ def builtin_industry_type(name, args, pos): @return The industry type in the format used by grfs (industry prop 0x16 and var 0x64) """ if len(args) != 2: - raise generic.ScriptError(name + "() must have 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have 2 parameters", pos) type = args[0].reduce_constant(global_constants.const_list).value if type not in (0, 1): @@ -532,11 +532,11 @@ def builtin_industry_type(name, args, pos): @builtins("accept_cargo", "produce_cargo") def builtin_cargoexpr(name, args, pos): if len(args) < 1: - raise generic.ScriptError(name + "() must have 1 or more parameters", pos) + raise generic.ScriptError(f"{name}() must have 1 or more parameters", pos) if not isinstance(args[0], StringLiteral) or args[0].value not in global_constants.cargo_numbers: raise generic.ScriptError( - "First argument of " + name + "() must be a string literal that is also in your cargo table", pos + f"First argument of {name}() must be a string literal that is also in your cargo table", pos ) cargotype = global_constants.cargo_numbers[args[0].value] @@ -551,10 +551,10 @@ def builtin_cargoexpr(name, args, pos): @builtins("acos", "asin", "atan", "cos", "sin", "sqrt", "tan") def builtin_math(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) val = args[0].reduce() if not isinstance(val, (ConstantNumeric, ConstantFloat)): - raise generic.ScriptError("Parameter for " + name + "() must be a constant", pos) + raise generic.ScriptError(f"Parameter for {name}() must be a constant", pos) math_func_table = { "acos": math.acos, "asin": math.asin, @@ -570,36 +570,36 @@ def builtin_math(name, args, pos): @builtin def builtin_round(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) val = args[0].reduce() if not isinstance(val, (ConstantNumeric, ConstantFloat)): - raise generic.ScriptError("Parameter for " + name + "() must be a constant", pos) + raise generic.ScriptError(f"Parameter for {name}() must be a constant", pos) return ConstantNumeric(round(val.value), pos) @builtin def builtin_int(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) val = args[0].reduce() if not isinstance(val, (ConstantNumeric, ConstantFloat)): - raise generic.ScriptError("Parameter for " + name + "() must be a constant", pos) + raise generic.ScriptError(f"Parameter for {name}() must be a constant", pos) return ConstantNumeric(int(val.value), val.pos) @builtin def builtin_abs(name, args, pos): if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) return AbsOp(args[0], args[0].pos).reduce() @builtin def builtin_sound(name, args, pos): if len(args) not in (1, 2): - raise generic.ScriptError(name + "() must have 1 or 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have 1 or 2 parameters", pos) if not isinstance(args[0], StringLiteral): - raise generic.ScriptError("Parameter for " + name + "() must be a string literal", pos) + raise generic.ScriptError(f"Parameter for {name}() must be a string literal", pos) volume = args[1].reduce_constant().value if len(args) >= 2 else 100 generic.check_range(volume, 0, 100, "sound volume", pos) from nml.actions import action11 @@ -610,7 +610,7 @@ def builtin_sound(name, args, pos): @builtin def builtin_import_sound(name, args, pos): if len(args) not in (2, 3): - raise generic.ScriptError(name + "() must have 2 or 3 parameters", pos) + raise generic.ScriptError(f"{name}() must have 2 or 3 parameters", pos) grfid = parse_string_to_dword(args[0].reduce()) sound_num = args[1].reduce_constant().value volume = args[2].reduce_constant().value if len(args) >= 3 else 100 @@ -628,7 +628,7 @@ def builtin_relative_coord(name, args, pos): @return Coordinates in 0xYYXX format. """ if len(args) != 2: - raise generic.ScriptError(name + "() must have x and y coordinates as parameters", pos) + raise generic.ScriptError(f"{name}() must have x and y coordinates as parameters", pos) if isinstance(args[0], ConstantNumeric): generic.check_range(args[0].value, 0, 255, "Argument of '{}'".format(name), args[0].pos) @@ -652,7 +652,7 @@ def builtin_num_corners_raised(name, args, pos): @return Number of raised corners in a slope (4 for steep slopes) """ if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) slope = args[0] # The returned value is ((slope x 0x8421) & 0x11111) % 0xF @@ -676,7 +676,7 @@ def builtin_slope_to_sprite_offset(name, args, pos): @return sprite offset to use """ if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) if isinstance(args[0], ConstantNumeric): generic.check_range(args[0].value, 0, 15, "Argument of '{}'".format(name), args[0].pos) @@ -702,7 +702,7 @@ def builtin_palette_1cc(name, args, pos): @return Recolour sprite to use """ if len(args) != 1: - raise generic.ScriptError(name + "() must have 1 parameter", pos) + raise generic.ScriptError(f"{name}() must have 1 parameter", pos) if isinstance(args[0], ConstantNumeric): generic.check_range(args[0].value, 0, 15, "Argument of '{}'".format(name), args[0].pos) @@ -718,7 +718,7 @@ def builtin_palette_2cc(name, args, pos): @return Recolour sprite to use """ if len(args) != 2: - raise generic.ScriptError(name + "() must have 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have 2 parameters", pos) for i in range(0, 2): if isinstance(args[i], ConstantNumeric): @@ -740,7 +740,7 @@ def builtin_vehicle_curv_info(name, args, pos): @return Value to use with vehicle var curv_info """ if len(args) != 2: - raise generic.ScriptError(name + "() must have 2 parameters", pos) + raise generic.ScriptError(f"{name}() must have 2 parameters", pos) for arg in args: if isinstance(arg, ConstantNumeric): @@ -759,11 +759,11 @@ def builtin_format_string(name, args, pos): @return Formatted string """ if len(args) < 1: - raise generic.ScriptError(name + "() must have at least one parameter", pos) + raise generic.ScriptError(f"{name}() must have at least one parameter", pos) format = args[0].reduce() if not isinstance(format, StringLiteral): - raise generic.ScriptError(name + "() parameter 1 'format' must be a literal string", format.pos) + raise generic.ScriptError(f"{name}() parameter 1 'format' must be a literal string", format.pos) # Validate other args format_args = [] @@ -771,7 +771,7 @@ def builtin_format_string(name, args, pos): arg = arg.reduce() if not isinstance(arg, (StringLiteral, ConstantFloat, ConstantNumeric)): raise generic.ScriptError( - name + "() parameter {:d} is not a constant number of literal string".format(i + 1), arg.pos + f"{name}() parameter {i + 1:d} is not a constant number of literal string", arg.pos ) format_args.append(arg.value) @@ -779,7 +779,7 @@ def builtin_format_string(name, args, pos): result = format.value % tuple(format_args) return StringLiteral(result, pos) except Exception as ex: - raise generic.ScriptError("Invalid combination of format / arguments for {}: {}".format(name, str(ex)), pos) + raise generic.ScriptError(f"Invalid combination of format / arguments for {name}: {str(ex)}", pos) # } diff --git a/nml/expression/identifier.py b/nml/expression/identifier.py index 426bdb4b9..924086e83 100644 --- a/nml/expression/identifier.py +++ b/nml/expression/identifier.py @@ -74,7 +74,7 @@ def reduce(self, id_dicts=None, unknown_id_fatal=True, search_func_ptr=False): return func(self.value, id_d[self.value], self.pos).reduce(id_dicts) if unknown_id_fatal and not ignore_all_invalid_ids: - raise generic.ScriptError("Unrecognized identifier '" + self.value + "' encountered", self.pos) + raise generic.ScriptError(f"Unrecognized identifier '{self.value}' encountered", self.pos) return self diff --git a/nml/generic.py b/nml/generic.py index a39180bce..c0e7096b8 100644 --- a/nml/generic.py +++ b/nml/generic.py @@ -248,7 +248,7 @@ def __init__(self, pos=None): class RangeError(ScriptError): def __init__(self, value, min_value, max_value, name, pos=None): ScriptError.__init__( - self, name + " out of range " + str(min_value) + ".." + str(max_value) + ", encountered " + str(value), pos + self, f"{name} out of range {str(min_value)}..{str(max_value)}, encountered {str(value)}", pos )