From c87a7f9f6cf3e8e9dd3c0ca5d4596c5b65e2482e Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 01:44:45 +0200 Subject: [PATCH 01/24] Updated .editorconfig Straight-up copied the one from OpenRA. --- .editorconfig | 824 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 584 insertions(+), 240 deletions(-) diff --git a/.editorconfig b/.editorconfig index 1786a6e00..8388ebc63 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -; Top-most http://editorconfig.org/ file +; Top-most https://editorconfig.org/ file root = true charset=utf-8 @@ -23,60 +23,111 @@ indent_size = 4 # Rules are listed below with any options available. # Options are commented out if they match the defaults. -### Language Rules +### Language and Unnecessary Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules -## this and Me preferences +## 'using' directive preferences -# IDE0003/IDE0009 Remove 'this' or 'Me' qualification/Add 'this' or 'Me' qualification -#dotnet_style_qualification_for_field = false -#dotnet_style_qualification_for_property = false -#dotnet_style_qualification_for_method = false -#dotnet_style_qualification_for_event = false -dotnet_diagnostic.IDE0003.severity = warning -dotnet_diagnostic.IDE0009.severity = warning +# IDE0073 Require file header +#file_header_template = unset +# This rule does not allow us to enforce our desired header, as it prefixes the header lines with // comments, meaning we can't apply a region. +dotnet_diagnostic.IDE0073.severity = none -## Use languages keywords for types +# IDE0005 Remove unnecessary import +# No options +# IDE0005 is only enabled in the IDE by default. https://github.com/dotnet/roslyn/issues/41640 +# To enable it for builds outside the IDE the 'GenerateDocumentationFile' property must be enabled on the build. +# GenerateDocumentationFile generates additional warnings about XML docs, so disable any we don't care about. +dotnet_diagnostic.CS1591.severity = none # Missing XML comment for publicly visible type or member +dotnet_diagnostic.IDE0005.severity = warning -# IDE0049 Use language keywords instead of framework type names for type references -#dotnet_style_predefined_type_for_locals_parameters_members = true -#dotnet_style_predefined_type_for_member_access = true -dotnet_diagnostic.IDE0049.severity = warning +# IDE0065 'using' directive placement +#csharp_using_directive_placement = outside_namespace +dotnet_diagnostic.IDE0065.severity = silent -## Modifier preferences +## Code-block preferences -# IDE0036 Order modifiers -#csharp_preferred_modifier_order = public, private, protected, internal, file, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, required, volatile, async -dotnet_diagnostic.IDE0036.severity = warning +# IDE0011 Add braces +#csharp_prefer_braces = true +# No options match the style used in OpenRA. +dotnet_diagnostic.IDE0011.severity = none -# IDE0040 Add accessibility modifiers -dotnet_style_require_accessibility_modifiers = omit_if_default -dotnet_diagnostic.IDE0040.severity = warning +# IDE0063 Use simple 'using' statement +#csharp_prefer_simple_using_statement = true +dotnet_diagnostic.IDE0063.severity = silent -# IDE0044 Add readonly modifier -#dotnet_style_readonly_field = true -dotnet_diagnostic.IDE0044.severity = warning +# IDE0160/IDE0161 Use block-scoped namespace/Use file-scoped namespace +#csharp_style_namespace_declarations = block_scoped +dotnet_diagnostic.IDE0160.severity = warning +dotnet_diagnostic.IDE0161.severity = warning -# IDE0062 Make local function static -#csharp_prefer_static_local_function = true -dotnet_diagnostic.IDE0062.severity = warning +# IDE0200 Remove unnecessary lambda expression +#csharp_style_prefer_method_group_conversion = true +dotnet_diagnostic.IDE0200.severity = silent # Requires C# 11 -# IDE0064 Make struct fields writable -# No options -dotnet_diagnostic.IDE0064.severity = warning +# IDE0210 Convert to top-level statements/IDE0211 Convert to 'Program.Main' style program +csharp_style_prefer_top_level_statements = false +dotnet_diagnostic.IDE0210.severity = warning +dotnet_diagnostic.IDE0211.severity = warning -## Parentheses preferences +# IDE0290 Use primary constructor +#csharp_style_prefer_primary_constructors = true +dotnet_diagnostic.IDE0200.severity = silent # Requires C# 12 -# IDE0047/IDE0048 Remove unnecessary parentheses/Add parentheses for clarity -dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary -dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary -#dotnet_style_parentheses_in_other_binary_operators = always_for_clarity -#dotnet_style_parentheses_in_other_operators = never_if_unnecessary -dotnet_diagnostic.IDE0047.severity = warning -dotnet_diagnostic.IDE0048.severity = warning +# IDE0330 Prefer 'System.Threading.Lock' +#csharp_prefer_system_threading_lock = true +dotnet_diagnostic.IDE0330.severity = silent # Requires C# 13 + +## Expression-bodied members + +# IDE0021 Use expression body for constructors +#csharp_style_expression_bodied_constructors = false +dotnet_diagnostic.IDE0021.severity = silent + +# IDE0022 Use expression body for methods +#csharp_style_expression_bodied_methods = false +dotnet_diagnostic.IDE0022.severity = silent + +# IDE0023/IDE0024 Use expression body for conversion operators/Use expression body for operators +#csharp_style_expression_bodied_operators = false +dotnet_diagnostic.IDE0023.severity = silent +dotnet_diagnostic.IDE0024.severity = silent + +# IDE0025 Use expression body for properties +#csharp_style_expression_bodied_properties = true +dotnet_diagnostic.IDE0025.severity = silent + +# IDE0026 Use expression body for indexers +#csharp_style_expression_bodied_indexers = true +dotnet_diagnostic.IDE0026.severity = silent + +# IDE0027 Use expression body for accessors +#csharp_style_expression_bodied_accessors = true +dotnet_diagnostic.IDE0027.severity = warning + +# IDE0053 Use expression body for lambdas +# This rule is buggy and not enforced for builds. ':warning' will at least enforce it in the IDE. +csharp_style_expression_bodied_lambdas = when_on_single_line:warning +dotnet_diagnostic.IDE0053.severity = warning + +# IDE0061 Use expression body for local functions +csharp_style_expression_bodied_local_functions = when_on_single_line +dotnet_diagnostic.IDE0061.severity = warning ## Expression-level preferences +# IDE0001 Simplify name +# No options +dotnet_diagnostic.IDE0001.severity = warning + +# IDE0002 Simplify member access +# No options +dotnet_diagnostic.IDE0002.severity = warning + +# IDE0004 Remove unnecessary cast +# No options +dotnet_diagnostic.IDE0004.severity = warning + # IDE0010 Add missing cases to switch statement # No options dotnet_diagnostic.IDE0010.severity = silent @@ -85,14 +136,20 @@ dotnet_diagnostic.IDE0010.severity = silent #dotnet_style_object_initializer = true dotnet_diagnostic.IDE0017.severity = warning -# IDE0018 Inline variable declaration -#csharp_style_inlined_variable_declaration = true -dotnet_diagnostic.IDE0018.severity = warning - # IDE0028 Use collection initializers #dotnet_style_collection_initializer = true dotnet_diagnostic.IDE0028.severity = warning +# IDE0029/IDE0030/IDE0270 Use coalesce expression (non-nullable types)/Use coalesce expression (nullable types)/Use coalesce expression (if null) +#dotnet_style_coalesce_expression = true +dotnet_diagnostic.IDE0029.severity = warning +dotnet_diagnostic.IDE0030.severity = warning +dotnet_diagnostic.IDE0270.severity = silent + +# IDE0031 Use null propagation +#dotnet_style_null_propagation = true +dotnet_diagnostic.IDE0031.severity = warning + # IDE0032 Use auto-implemented property #dotnet_style_prefer_auto_properties = true dotnet_diagnostic.IDE0032.severity = warning @@ -101,22 +158,19 @@ dotnet_diagnostic.IDE0032.severity = warning #dotnet_style_explicit_tuple_names = true dotnet_diagnostic.IDE0033.severity = warning -# IDE0034 Simplify 'default' expression -#csharp_prefer_simple_default_expression = true -dotnet_diagnostic.IDE0034.severity = warning +# IDE0035 Remove unreachable code +# No options +# Duplicates compiler warning CS0162 +dotnet_diagnostic.IDE0035.severity = none # IDE0037 Use inferred member name #dotnet_style_prefer_inferred_tuple_names = true #dotnet_style_prefer_inferred_anonymous_type_member_names = true dotnet_diagnostic.IDE0037.severity = silent -# IDE0039 Use local function instead of lambda -#csharp_style_prefer_local_over_anonymous_function = true -dotnet_diagnostic.IDE0039.severity = warning - -# IDE0042 Deconstruct variable declaration -#csharp_style_deconstructed_variable_declaration = true -dotnet_diagnostic.IDE0042.severity = warning +# IDE0041 Use 'is null' check +#dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_diagnostic.IDE0041.severity = warning # IDE0045 Use conditional expression for assignment #dotnet_style_prefer_conditional_expression_over_assignment = true @@ -130,18 +184,26 @@ dotnet_diagnostic.IDE0046.severity = silent # No options dotnet_diagnostic.IDE0050.severity = silent +# IDE0051 Remove unused private member +# No options +dotnet_diagnostic.IDE0051.severity = warning + +# IDE0052 Remove unread private member +# No options +dotnet_diagnostic.IDE0052.severity = warning + # IDE0054/IDE0074 Use compound assignment/Use coalesce compound assignment #dotnet_style_prefer_compound_assignment = true dotnet_diagnostic.IDE0054.severity = warning dotnet_diagnostic.IDE0074.severity = warning -# IDE0056 Use index operator -#csharp_style_prefer_index_operator = true -dotnet_diagnostic.IDE0056.severity = warning +# IDE0058 Remove unnecessary expression value +#csharp_style_unused_value_expression_statement_preference = discard_variable +dotnet_diagnostic.IDE0058.severity = silent -# IDE0057 Use range operator -#csharp_style_prefer_range_operator = true -dotnet_diagnostic.IDE0057.severity = warning +# IDE0059 Remove unnecessary value assignment +#csharp_style_unused_value_assignment_preference = discard_variable +dotnet_diagnostic.IDE0059.severity = warning # IDE0070 Use 'System.HashCode.Combine' # No options @@ -151,10 +213,6 @@ dotnet_diagnostic.IDE0070.severity = warning #dotnet_style_prefer_simplified_interpolation = true dotnet_diagnostic.IDE0071.severity = warning -# IDE0072 Add missing cases to switch expression -# No options -dotnet_diagnostic.IDE0072.severity = silent - # IDE0075 Simplify conditional expression #dotnet_style_prefer_simplified_boolean_expressions = true dotnet_diagnostic.IDE0075.severity = warning @@ -163,95 +221,185 @@ dotnet_diagnostic.IDE0075.severity = warning # No options dotnet_diagnostic.IDE0082.severity = warning +# IDE0100 Remove unnecessary equality operator +# No options +dotnet_diagnostic.IDE0100.severity = warning + +# IDE0120 Simplify LINQ expression +# No options +dotnet_diagnostic.IDE0120.severity = warning + +# IDE0130 Namespace does not match folder structure +#dotnet_style_namespace_match_folder = true +# This rule doesn't appear to work (never reports violations) +dotnet_diagnostic.IDE0130.severity = none + +# IDE0016 Use throw expression +#csharp_style_throw_expression = true +dotnet_diagnostic.IDE0016.severity = silent + +# IDE0018 Inline variable declaration +#csharp_style_inlined_variable_declaration = true +dotnet_diagnostic.IDE0018.severity = warning + +# IDE0034 Simplify 'default' expression +#csharp_prefer_simple_default_expression = true +dotnet_diagnostic.IDE0034.severity = warning + +# IDE0039 Use local function instead of lambda +#csharp_style_prefer_local_over_anonymous_function = true +dotnet_diagnostic.IDE0039.severity = warning + +# IDE0042 Deconstruct variable declaration +#csharp_style_deconstructed_variable_declaration = true +dotnet_diagnostic.IDE0042.severity = warning + +# IDE0056 Use index operator +#csharp_style_prefer_index_operator = true +dotnet_diagnostic.IDE0056.severity = warning + +# IDE0057 Use range operator +#csharp_style_prefer_range_operator = true +dotnet_diagnostic.IDE0057.severity = warning + +# IDE0072 Add missing cases to switch expression +# No options +dotnet_diagnostic.IDE0072.severity = silent + +# IDE0080 Remove unnecessary suppression operator +# No options +dotnet_diagnostic.IDE0080.severity = warning + # IDE0090 Simplify 'new' expression #csharp_style_implicit_object_creation_when_type_is_apparent = true dotnet_diagnostic.IDE0090.severity = warning +# IDE0110 Remove unnecessary discard +# No options +dotnet_diagnostic.IDE0110.severity = warning + +# IDE0150 Prefer 'null' check over type check +#csharp_style_prefer_null_check_over_type_check = true +dotnet_diagnostic.IDE0150.severity = warning + # IDE0180 Use tuple to swap values #csharp_style_prefer_tuple_swap = true dotnet_diagnostic.IDE0180.severity = warning -## Namespace declaration preferences +# IDE0220 Add explicit cast in foreach loop +#dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_diagnostic.IDE0220.severity = warning -# IDE0160/IDE0161 Use block-scoped namespace/Use file-scoped namespace -#csharp_style_namespace_declarations = block_scoped -dotnet_diagnostic.IDE0160.severity = warning -dotnet_diagnostic.IDE0161.severity = warning +# IDE0230 Use UTF-8 string literal +#csharp_style_prefer_utf8_string_literals = true +dotnet_diagnostic.IDE0230.severity = silent # Requires C# 11 -## Null-checking preferences +# IDE0240 Nullable directive is redundant +# No options +dotnet_diagnostic.IDE0240.severity = warning -# IDE0016 Use throw expression -#csharp_style_throw_expression = true -dotnet_diagnostic.IDE0016.severity = silent +# IDE0241 Nullable directive is unnecessary +# No options +dotnet_diagnostic.IDE0241.severity = warning -# IDE0029/IDE0030/IDE0270 Use coalesce expression (non-nullable types)/Use coalesce expression (nullable types)/Use coalesce expression (if null) -#dotnet_style_coalesce_expression = true -dotnet_diagnostic.IDE0029.severity = warning -dotnet_diagnostic.IDE0030.severity = warning -dotnet_diagnostic.IDE0270.severity = silent +# This option applies to the collection expression rules below +# .NET 8 defaults to true/when_types_exactly_match, .NET 9+ defaults to when_types_loosely_match +#dotnet_style_prefer_collection_expression = true -# IDE0031 Use null propagation -#dotnet_style_null_propagation = true -dotnet_diagnostic.IDE0031.severity = warning +# IDE0300 Use collection expression for array +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0300.severity = silent # Requires C# 12 -# IDE0041 Use 'is null' check -#dotnet_style_prefer_is_null_check_over_reference_equality_method = true -dotnet_diagnostic.IDE0041.severity = warning +# IDE0301 Use collection expression for empty +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0301.severity = silent # Requires C# 12 -# IDE0150 Prefer 'null' check over type check -#csharp_style_prefer_null_check_over_type_check = true -dotnet_diagnostic.IDE0150.severity = warning +# IDE0302 Use collection expression for stackalloc +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0302.severity = silent # Requires C# 12 + +# IDE0303 Use collection expression for 'Create()' +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0303.severity = silent # Requires C# 12 + +# IDE0304 Use collection expression for builder +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0304.severity = silent # Requires C# 12 + +# IDE0305 Use collection expression for fluent +# From above, uses dotnet_style_prefer_collection_expression +dotnet_diagnostic.IDE0305.severity = silent # Requires C# 12 + +## Field preferences + +# IDE0044 Add readonly modifier +#dotnet_style_readonly_field = true +dotnet_diagnostic.IDE0044.severity = warning + +## Language keyword vs. framework types preferences + +# IDE0049 Use language keywords instead of framework type names for type references +#dotnet_style_predefined_type_for_locals_parameters_members = true +#dotnet_style_predefined_type_for_member_access = true +dotnet_diagnostic.IDE0049.severity = warning + +## Modifier preferences + +# IDE0036 Order modifiers +#csharp_preferred_modifier_order = public, private, protected, internal, file, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, required, volatile, async +dotnet_diagnostic.IDE0036.severity = warning + +# IDE0040 Add accessibility modifiers +dotnet_style_require_accessibility_modifiers = omit_if_default +dotnet_diagnostic.IDE0040.severity = warning -# IDE1005 Use conditional delegate call -csharp_style_conditional_delegate_call = true # true is the default, but the rule is not triggered if this is not specified. -dotnet_diagnostic.IDE1005.severity = warning +# IDE0062 Make local function static +#csharp_prefer_static_local_function = true +dotnet_diagnostic.IDE0062.severity = warning -## var preferences +# IDE0064 Make struct fields writable +# No options +dotnet_diagnostic.IDE0064.severity = warning -# IDE0007/IDE0008 Use 'var' instead of explicit type/Use explicit type instead of 'var' -csharp_style_var_for_built_in_types = true -csharp_style_var_when_type_is_apparent = true -csharp_style_var_elsewhere = true -dotnet_diagnostic.IDE0007.severity = warning -dotnet_diagnostic.IDE0008.severity = warning +# IDE0250 Struct can be made 'readonly' +#csharp_style_prefer_readonly_struct = true +dotnet_diagnostic.IDE0250.severity = warning -## Expression-bodied-members +# IDE0251 Member can be made 'readonly' +#csharp_style_prefer_readonly_struct_member = true +dotnet_diagnostic.IDE0251.severity = warning -# IDE0021 Use expression body for constructors -#csharp_style_expression_bodied_constructors = false -dotnet_diagnostic.IDE0021.severity = silent +# IDE0320 Make anonymous function static +#csharp_prefer_static_anonymous_function = true +dotnet_diagnostic.IDE0320.severity = warning -# IDE0022 Use expression body for methods -#csharp_style_expression_bodied_methods = false -dotnet_diagnostic.IDE0022.severity = silent +## Null-checking preferences -# IDE0023/IDE0024 Use expression body for conversion operators/Use expression body for operators -#csharp_style_expression_bodied_operators = false -dotnet_diagnostic.IDE0023.severity = silent -dotnet_diagnostic.IDE0024.severity = silent +# IDE1005 Use conditional delegate call +csharp_style_conditional_delegate_call = true # true is the default, but the rule is not triggered if this is not specified. +dotnet_diagnostic.IDE1005.severity = warning -# IDE0025 Use expression body for properties -#csharp_style_expression_bodied_properties = true -dotnet_diagnostic.IDE0025.severity = silent +## Parameter preferences -# IDE0026 Use expression body for indexers -#csharp_style_expression_bodied_indexers = true -dotnet_diagnostic.IDE0026.severity = silent +# IDE0060 Remove unused parameter +dotnet_code_quality_unused_parameters = non_public +dotnet_diagnostic.IDE0060.severity = warning -# IDE0027 Use expression body for accessors -#csharp_style_expression_bodied_accessors = true -dotnet_diagnostic.IDE0027.severity = warning +# IDE0280 Use 'nameof' +# No options +dotnet_diagnostic.IDE0280.severity = silent # Requires C# 11 -# IDE0053 Use expression body for lambdas -# This rule is buggy and not enforced for builds. ':warning' will at least enforce it in the IDE. -csharp_style_expression_bodied_lambdas = when_on_single_line:warning -dotnet_diagnostic.IDE0053.severity = warning +## Parentheses preferences -# IDE0061 Use expression body for local functions -csharp_style_expression_bodied_local_functions = when_on_single_line -dotnet_diagnostic.IDE0061.severity = warning +# IDE0047/IDE0048 Remove unnecessary parentheses/Add parentheses for clarity +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary +#dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +#dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_diagnostic.IDE0047.severity = warning +dotnet_diagnostic.IDE0048.severity = warning -## Pattern matching preferences +## Pattern-matching preferences # IDE0019 Use pattern matching to avoid 'as' followed by a 'null' check #csharp_style_pattern_matching_over_as_with_null_check = true @@ -266,9 +414,11 @@ dotnet_diagnostic.IDE0038.severity = warning #csharp_style_prefer_switch_expression = true dotnet_diagnostic.IDE0066.severity = silent -# IDE0078 Use pattern matching +# IDE0078/IDE0260 Use pattern matching #csharp_style_prefer_pattern_matching = true +#csharp_style_pattern_matching_over_as_with_null_check = true dotnet_diagnostic.IDE0078.severity = silent +dotnet_diagnostic.IDE0260.severity = silent # IDE0083 Use pattern matching ('not' operator) #csharp_style_prefer_not_pattern = true @@ -278,100 +428,31 @@ dotnet_diagnostic.IDE0083.severity = warning #csharp_style_prefer_extended_property_pattern = true dotnet_diagnostic.IDE0170.severity = silent # Requires C# 10 -## Code block preferences - -# IDE0011 Add braces -#csharp_prefer_braces = true -# No options match the style used in OpenRA. -dotnet_diagnostic.IDE0011.severity = none - -# IDE0063 Use simple 'using' statement -#csharp_prefer_simple_using_statement = true -dotnet_diagnostic.IDE0063.severity = silent - -## 'using' directive preferences - -# IDE0065 'using' directive placement -#csharp_using_directive_placement = outside_namespace -dotnet_diagnostic.IDE0065.severity = silent - -## File header preferences - -# IDE0073 Require file header -#file_header_template = unset -# This rule does not allow us to enforce our desired header, as it prefixes the header lines with // comments, meaning we can't apply a region. -dotnet_diagnostic.IDE0073.severity = none - -## Namespace naming preferences - -# IDE0130 Namespace does not match folder structure -#dotnet_style_namespace_match_folder = true -# This rule doesn't appear to work (never reports violations) -dotnet_diagnostic.IDE0130.severity = none - -### Unnecessary Code Rules -### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/unnecessary-code-rules - -# IDE0001 Simplify name -# No options -dotnet_diagnostic.IDE0001.severity = warning - -# IDE0002 Simplify member access -# No options -dotnet_diagnostic.IDE0002.severity = warning - -# IDE0004 Remove unnecessary cast -# No options -dotnet_diagnostic.IDE0004.severity = warning - -# IDE0005 Remove unnecessary import -# No options -# IDE0005 is only enabled in the IDE by default. https://github.com/dotnet/roslyn/issues/41640 -# To enable it for builds outside the IDE the 'GenerateDocumentationFile' property must be enabled on the build. -# GenerateDocumentationFile generates additional warnings about XML docs, so disable any we don't care about. -dotnet_diagnostic.CS1591.severity = none # Missing XML comment for publicly visible type or member -dotnet_diagnostic.IDE0005.severity = warning - -# IDE0035 Remove unreachable code -# No options -# Duplicates compiler warning CS0162 -dotnet_diagnostic.IDE0035.severity = none - -# IDE0051 Remove unused private member -# No options -dotnet_diagnostic.IDE0051.severity = warning - -# IDE0052 Remove unread private member -# No options -dotnet_diagnostic.IDE0052.severity = warning - -# IDE0058 Remove unnecessary expression value -#csharp_style_unused_value_expression_statement_preference = discard_variable -dotnet_diagnostic.IDE0058.severity = silent - -# IDE0059 Remove unnecessary value assignment -#csharp_style_unused_value_assignment_preference = discard_variable -dotnet_diagnostic.IDE0059.severity = warning - -# IDE0060 Remove unused parameter -dotnet_code_quality_unused_parameters = non_public -dotnet_diagnostic.IDE0060.severity = warning +## Suppression preferences # IDE0079 Remove unnecessary suppression #dotnet_remove_unnecessary_suppression_exclusions = none dotnet_diagnostic.IDE0079.severity = warning -# IDE0080 Remove unnecessary suppression operator -# No options -dotnet_diagnostic.IDE0080.severity = warning +## 'this' and 'Me' preferences -# IDE0100 Remove unnecessary equality operator -# No options -dotnet_diagnostic.IDE0100.severity = warning +# IDE0003/IDE0009 Remove 'this' or 'Me' qualification/Add 'this' or 'Me' qualification +#dotnet_style_qualification_for_field = false +#dotnet_style_qualification_for_property = false +#dotnet_style_qualification_for_method = false +#dotnet_style_qualification_for_event = false +dotnet_diagnostic.IDE0003.severity = warning +dotnet_diagnostic.IDE0009.severity = warning + +## 'var' preferences + +# IDE0007/IDE0008 Use 'var' instead of explicit type/Use explicit type instead of 'var' +csharp_style_var_for_built_in_types = true +csharp_style_var_when_type_is_apparent = true +csharp_style_var_elsewhere = true +dotnet_diagnostic.IDE0007.severity = warning +dotnet_diagnostic.IDE0008.severity = warning -# IDE0110 Remove unnecessary discard -# No options -dotnet_diagnostic.IDE0110.severity = warning ### Miscellaneous Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/miscellaneous-rules @@ -386,14 +467,10 @@ dotnet_diagnostic.IDE0077.severity = warning ### Formatting Rules (IDE0055) ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0055 - -# We may eventually wish to enforce this rule, however some existing formatting conflicts with the rule despite being reasonable. -# Additionally, the rule is buggy and likes to report spuriously after invoking Format Document in the IDE. -dotnet_diagnostic.IDE0055.severity = none +dotnet_diagnostic.IDE0055.severity = warning #dotnet_sort_system_directives_first = true #dotnet_separate_import_directive_groups = false -#dotnet_style_namespace_match_folder = true #csharp_new_line_before_open_brace = all #csharp_new_line_before_else = true @@ -408,7 +485,7 @@ dotnet_diagnostic.IDE0055.severity = none #csharp_indent_labels = one_less_than_current #csharp_indent_block_contents = true #csharp_indent_braces = false -#csharp_indent_case_contents_when_block = true +csharp_indent_case_contents_when_block = false #csharp_space_after_cast = false #csharp_space_after_keywords_in_control_flow_statements = true @@ -598,6 +675,7 @@ dotnet_diagnostic.SA1649.severity = none # FileNameMustMatchTypeName #### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ # Below we enable specific rules by setting severity to warning. +# Rules are disabled by setting severity to silent (to still allow use in IDE) or none (to prevent all use). # Rules are listed below with any options available. # Options are commented out if they match the defaults. @@ -660,6 +738,18 @@ dotnet_diagnostic.CA1200.severity = warning ### Globalization Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/globalization-warnings +# Specify 'CultureInfo'. +dotnet_diagnostic.CA1304.severity = warning + +# Specify 'IFormatProvider'. +dotnet_diagnostic.CA1305.severity = warning + +# Specify 'StringComparison' for correctness. +dotnet_diagnostic.CA1310.severity = warning + +# Specify a culture or use an invariant version. +dotnet_diagnostic.CA1311.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + ### Portability and Interoperability Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/interoperability-warnings @@ -672,6 +762,21 @@ dotnet_diagnostic.CA1417.severity = warning # Use 'nameof' in place of string. dotnet_diagnostic.CA1507.severity = warning +# Use ArgumentNullException throw helper. +dotnet_diagnostic.CA1510.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Use ArgumentException throw helper. +dotnet_diagnostic.CA1511.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Use ArgumentOutOfRangeException throw helper. +dotnet_diagnostic.CA1512.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Use ObjectDisposedException throw helper. +dotnet_diagnostic.CA1513.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Avoid redundant length argument. +dotnet_diagnostic.CA1514.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + ### Naming Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/naming-warnings @@ -773,22 +878,34 @@ dotnet_diagnostic.CA1846.severity = warning dotnet_diagnostic.CA1847.severity = warning # Call async methods when in an async method. -dotnet_diagnostic.CA1849.severity = warning +dotnet_diagnostic.CA1849.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Prefer static HashData method over ComputeHash. (Not available on mono) -dotnet_diagnostic.CA1850.severity = none +dotnet_diagnostic.CA1850.severity = none # TODO: Change to warning once using .NET 7 or later AND once supported by mono. + +# Possible multiple enumerations of IEnumerable collection. +#dotnet_code_quality.CA1851.enumeration_methods = +dotnet_code_quality.CA1851.linq_chain_methods = M:OpenRA.Traits.IRenderModifier.Modify* +dotnet_code_quality.CA1851.assume_method_enumerates_parameters = true +dotnet_diagnostic.CA1851.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Seal internal types. -dotnet_diagnostic.CA1852.severity = warning +dotnet_diagnostic.CA1852.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Unnecessary call to 'Dictionary.ContainsKey(key)'. -dotnet_diagnostic.CA1853.severity = warning +dotnet_diagnostic.CA1853.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Prefer the IDictionary.TryGetValue(TKey, out TValue) method. -dotnet_diagnostic.CA1854.severity = warning +dotnet_diagnostic.CA1854.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Use Span.Clear() instead of Span.Fill(). -dotnet_diagnostic.CA1855.severity = warning +dotnet_diagnostic.CA1855.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Incorrect usage of ConstantExpected attribute. +dotnet_diagnostic.CA1856.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# The parameter expects a constant for optimal performance. +dotnet_diagnostic.CA1857.severity = suggestion # TODO: Change to warning once using .NET 7 or later. # Use StartsWith instead of IndexOf. dotnet_diagnostic.CA1858.severity = warning @@ -796,6 +913,35 @@ dotnet_diagnostic.CA1858.severity = warning # Avoid using 'Enumerable.Any()' extension method. dotnet_diagnostic.CA1860.severity = warning +# Use the 'StringComparison' method overloads to perform case-insensitive string comparisons. +dotnet_diagnostic.CA1862.severity = warning + +# Use 'CompositeFormat'. +dotnet_diagnostic.CA1863.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Prefer the 'IDictionary.TryAdd(TKey, TValue)' method. +dotnet_diagnostic.CA1864.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Use 'string.Method(char)' instead of 'string.Method(string)' for string with single char. +dotnet_diagnostic.CA1865.severity = suggestion # TODO: Change to warning once using .NET 8 or later. +dotnet_diagnostic.CA1866.severity = suggestion # TODO: Change to warning once using .NET 8 or later. +dotnet_diagnostic.CA1867.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Unnecessary call to 'Contains' for sets. +dotnet_diagnostic.CA1868.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Cache and reuse 'JsonSerializerOptions' instances. +dotnet_diagnostic.CA1869.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Use a cached 'SearchValues' instance. +dotnet_diagnostic.CA1870.severity = suggestion # TODO: Change to warning once using .NET 8 or later. + +# Do not pass a nullable struct to 'ArgumentNullException.ThrowIfNull'. +dotnet_diagnostic.CA1871.severity = warning + +# Prefer 'Convert.ToHexString' and 'Convert.ToHexStringLower' over call chains based on 'BitConverter.ToString'. +dotnet_diagnostic.CA1872.severity = warning + ### Reliability Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/reliability-warnings @@ -818,7 +964,13 @@ dotnet_diagnostic.CA2016.severity = warning dotnet_diagnostic.CA2018.severity = warning # ThreadStatic fields should not use inline initialization. -dotnet_diagnostic.CA2019.severity = warning +dotnet_diagnostic.CA2019.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Don't call Enumerable.Cast or Enumerable.OfType with incompatible types. +dotnet_diagnostic.CA2021.severity = warning + +# Avoid inexact read with Stream.Read. +dotnet_diagnostic.CA2022.severity = warning ### Security Rules ### https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/security-warnings @@ -841,6 +993,9 @@ dotnet_diagnostic.CA2207.severity = warning # Instantiate argument exceptions correctly. dotnet_diagnostic.CA2208.severity = warning +# Non-constant fields should not be visible. +dotnet_diagnostic.CA2211.severity = silent + # Dispose methods should call base class dispose. dotnet_diagnostic.CA2215.severity = warning @@ -855,7 +1010,7 @@ dotnet_diagnostic.CA2231.severity = warning # Provide correct arguments to formatting methods. #dotnet_code_quality.CA2241.additional_string_formatting_methods = -dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true +#dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = false dotnet_diagnostic.CA2241.severity = warning # Test for NaN correctly. @@ -876,43 +1031,232 @@ dotnet_diagnostic.CA2247.severity = warning # Provide correct enum argument to Enum.HasFlag. dotnet_diagnostic.CA2248.severity = warning +# Consider using String.Contains instead of String.IndexOf. +dotnet_diagnostic.CA2249.severity = warning + # Use ThrowIfCancellationRequested. dotnet_diagnostic.CA2250.severity = warning +# Use String.Equals over String.Compare. +dotnet_diagnostic.CA2251.severity = warning + # Ensure ThreadStatic is only used with static fields. -dotnet_diagnostic.CA2259.severity = warning +dotnet_diagnostic.CA2259.severity = suggestion # TODO: Change to warning once using .NET 7 or later. + +# Prefer generic overload when type is known. +dotnet_diagnostic.CA2263.severity = none # TODO: Change to warning once mono is dropped. -### Roslynator -### https://github.com/JosefPihrt/Roslynator/tree/main/docs/analyzers +# Do not pass a non-nullable value to 'ArgumentNullException.ThrowIfNull'. +dotnet_diagnostic.CA2264.severity = warning +# Do not compare 'Span' to 'null' or 'default'. +dotnet_diagnostic.CA2265.severity = warning + +### Roslynator.Analyzers +### https://josefpihrt.github.io/docs/roslynator/analyzers + +# We disable the rule category by setting severity to none. # Below we enable specific rules by setting severity to warning. +# Rules are listed below with any options available. +# Options are commented out if they match the defaults. +dotnet_analyzer_diagnostic.category-roslynator.severity = none + +# A line is too long. +dotnet_diagnostic.RCS0056.severity = warning +roslynator_max_line_length = 160 #140 +#roslynator_tab_length = 4 + +# Remove redundant 'sealed' modifier. +dotnet_diagnostic.RCS1034.severity = warning + +# Remove argument list from attribute. +dotnet_diagnostic.RCS1039.severity = warning + +# Remove empty initializer. +dotnet_diagnostic.RCS1041.severity = warning + +# Remove enum default underlying type. +dotnet_diagnostic.RCS1042.severity = warning + +# Remove 'partial' modifier from type with a single part. +dotnet_diagnostic.RCS1043.severity = warning + +# Use lambda expression instead of anonymous method. +dotnet_diagnostic.RCS1048.severity = warning + +# Simplify boolean comparison. +dotnet_diagnostic.RCS1049.severity = warning + +# Use compound assignment. +dotnet_diagnostic.RCS1058.severity = warning + +# Avoid locking on publicly accessible instance. +dotnet_diagnostic.RCS1059.severity = warning + +# Merge 'if' with nested 'if'. +dotnet_diagnostic.RCS1061.severity = warning + +# Remove empty 'finally' clause. +dotnet_diagnostic.RCS1066.severity = warning + +# Simplify logical negation. +dotnet_diagnostic.RCS1068.severity = warning + +# Remove redundant base constructor call. +dotnet_diagnostic.RCS1071.severity = warning + +# Remove empty namespace declaration. +dotnet_diagnostic.RCS1072.severity = warning + +# Remove redundant constructor. +dotnet_diagnostic.RCS1074.severity = warning + +# Optimize LINQ method call. +dotnet_diagnostic.RCS1077.severity = warning # Use 'Count' property instead of 'Any' method. dotnet_diagnostic.RCS1080.severity = warning +# Use coalesce expression instead of conditional expression. +dotnet_diagnostic.RCS1084.severity = warning + +# Use --/++ operator instead of assignment. +dotnet_diagnostic.RCS1089.severity = warning + +# Remove empty region. +dotnet_diagnostic.RCS1091.severity = warning + +# Default label should be the last label in a switch section. +dotnet_diagnostic.RCS1099.severity = warning + +# Unnecessary interpolation. +dotnet_diagnostic.RCS1105.severity = warning + +# Remove redundant 'ToCharArray' call. +dotnet_diagnostic.RCS1107.severity = warning + +# Add 'static' modifier to all partial class declarations. +dotnet_diagnostic.RCS1108.severity = warning + +# Combine 'Enumerable.Where' method chain. +dotnet_diagnostic.RCS1112.severity = warning + +# Use 'string.IsNullOrEmpty' method. +dotnet_diagnostic.RCS1113.severity = warning + +# Mark local variable as const. +dotnet_diagnostic.RCS1118.severity = warning + +# Bitwise operation on enum without Flags attribute. +dotnet_diagnostic.RCS1130.severity = warning + +# Remove redundant overriding member. +dotnet_diagnostic.RCS1132.severity = warning + +# Remove redundant Dispose/Close call. +dotnet_diagnostic.RCS1133.severity = warning + +# Remove redundant statement. +dotnet_diagnostic.RCS1134.severity = warning + +# Merge switch sections with equivalent content. +dotnet_diagnostic.RCS1136.severity = warning + +# Simplify coalesce expression. +dotnet_diagnostic.RCS1143.severity = warning + +# Remove redundant cast. +dotnet_diagnostic.RCS1151.severity = warning + +# Use StringComparison when comparing strings. +dotnet_diagnostic.RCS1155.severity = warning + +# Use EventHandler. +dotnet_diagnostic.RCS1159.severity = warning + +# Unused type parameter. +dotnet_diagnostic.RCS1164.severity = warning + # Use read-only auto-implemented property. dotnet_diagnostic.RCS1170.severity = warning -# Unnecessary interpolated string. -dotnet_diagnostic.RCS1214.severity = warning +# Use 'is' operator instead of 'as' operator. +dotnet_diagnostic.RCS1172.severity = warning + +# Unused 'this' parameter. +dotnet_diagnostic.RCS1175.severity = warning + +# Unnecessary assignment. +dotnet_diagnostic.RCS1179.severity = warning + +# Use constant instead of field. +dotnet_diagnostic.RCS1187.severity = warning + +# Join string expressions. +dotnet_diagnostic.RCS1190.severity = warning + +# Declare enum value as combination of names. +dotnet_diagnostic.RCS1191.severity = warning # Unnecessary usage of verbatim string literal. dotnet_diagnostic.RCS1192.severity = warning -# Use pattern matching instead of combination of 'as' operator and null check. -dotnet_diagnostic.RCS1221.severity = warning +# Overriding member should not change 'params' modifier. +dotnet_diagnostic.RCS1193.severity = warning + +# Use ^ operator. +dotnet_diagnostic.RCS1195.severity = warning + +# Unnecessary null check. +dotnet_diagnostic.RCS1199.severity = warning + +# Use EventArgs.Empty. +dotnet_diagnostic.RCS1204.severity = warning + +# Order named arguments according to the order of parameters. +dotnet_diagnostic.RCS1205.severity = warning + +# Order type parameter constraints. +dotnet_diagnostic.RCS1209.severity = warning + +# Unnecessary interpolated string. +dotnet_diagnostic.RCS1214.severity = warning # Expression is always equal to 'true'. dotnet_diagnostic.RCS1215.severity = warning -# Use StringComparison when comparing strings. -dotnet_diagnostic.RCS1155.severity = warning +# Unnecessary unsafe context. +dotnet_diagnostic.RCS1216.severity = warning -# Abstract type should not have public constructors. -dotnet_diagnostic.RCS1160.severity = warning +# Simplify code branching. +dotnet_diagnostic.RCS1218.severity = warning -# Optimize 'Dictionary.ContainsKey' call. +# Use pattern matching instead of combination of 'is' operator and cast operator. +dotnet_diagnostic.RCS1220.severity = warning + +# Make class sealed. +dotnet_diagnostic.RCS1225.severity = warning + +# Add paragraph to documentation comment. +dotnet_diagnostic.RCS1226.severity = warning + +# Validate arguments correctly. +dotnet_diagnostic.RCS1227.severity = warning + +# Unnecessary explicit use of enumerator. +dotnet_diagnostic.RCS1230.severity = warning + +# Use short-circuiting operator. +dotnet_diagnostic.RCS1233.severity = warning + +# Optimize method call. dotnet_diagnostic.RCS1235.severity = warning -# Call extension method as instance method. -dotnet_diagnostic.RCS1196.severity = warning +# Use exception filter. +dotnet_diagnostic.RCS1236.severity = warning + +# Use 'for' statement instead of 'while' statement. +dotnet_diagnostic.RCS1239.severity = warning + +# Use element access. +dotnet_diagnostic.RCS1246.severity = warning From 71a50dfd36d9e9b296d852ec8d16b315775ee708 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 01:48:26 +0200 Subject: [PATCH 02/24] Updated GitHub workflows As per OpenRA PRs 21379, 21523 and 21635. --- .github/workflows/ci.yml | 10 +++++----- .github/workflows/packaging.yml | 15 +++++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73749d04e..770f889e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,10 +14,10 @@ jobs: steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install .NET 6.0 - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' @@ -43,7 +43,7 @@ jobs: steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Prepare Environment run: | @@ -67,10 +67,10 @@ jobs: steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install .NET 6.0 - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index 7a32f93b6..98b3d76d5 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install .NET 6.0 - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' @@ -28,7 +28,6 @@ jobs: run: | make engine mkdir -p build/linux - sudo apt install libfuse2 ./packaging/linux/buildpackage.sh "${GIT_TAG}" "${PWD}/build/linux" - name: Upload Packages @@ -42,13 +41,13 @@ jobs: macos: name: macOS Disk Image - runs-on: macos-11 + runs-on: macos-13 steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install .NET 6.0 - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' @@ -81,10 +80,10 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install .NET 6.0 - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '6.0.x' From 54e721b2f30b372aac54a176dc73b7b59f1bab57 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 01:50:48 +0200 Subject: [PATCH 03/24] Updated all links to HTTPS As per OpenRA PR 21427. --- CODE_OF_CONDUCT.md | 6 +++--- CONTRIBUTING.md | 4 ++-- COPYING | 8 ++++---- mod.config | 4 ++-- packaging/functions.sh | 2 +- packaging/windows/buildpackage.nsi | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 67894ae9a..3a7d532a0 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -70,7 +70,7 @@ members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] +available at [https://contributor-covenant.org/version/1/4][version] -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +[homepage]: https://contributor-covenant.org +[version]: https://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 14ee84ec2..a2c430c03 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,9 +7,9 @@ Please note that this repository is specifically for the scripts and infrastruct When developing new features, it is important to make sure that they work on all our supported platforms. Right now, this means Windows >= 7 (with PowerShell >= 3), macOS >= 10.7, and Linux. We would like to also support *BSD, but do not currently have a means to test this. Some issues to be aware of include: -* Use http://www.shellcheck.net/ to confirm POSIX compatibility of *.sh scripts. +* Use https://www.shellcheck.net/ to confirm POSIX compatibility of *.sh scripts. * Avoid non-standard gnu extensions to common Unix tools (e.g. the `-f` flag from GNU `readlink`) While your pull-request is in review it will be helpful if you join IRC to discuss the changes. -See also the in-depth guide on [contributing](https://github.com/OpenRA/OpenRA/wiki/Contributing) on the main OpenRA project wiki. Most of the content on this page also applies to the Mod SDK. \ No newline at end of file +See also the in-depth guide on [contributing](https://github.com/OpenRA/OpenRA/wiki/Contributing) on the main OpenRA project wiki. Most of the content on this page also applies to the Mod SDK. diff --git a/COPYING b/COPYING index 94a9ed024..e60008693 100644 --- a/COPYING +++ b/COPYING @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. diff --git a/mod.config b/mod.config index 4f42e2214..6f1213ddf 100644 --- a/mod.config +++ b/mod.config @@ -40,10 +40,10 @@ PACKAGING_DISPLAY_NAME="Example Mod" # The URL for the project homepage. # This is used in: # - Windows "Add/Remove Programs" list -PACKAGING_WEBSITE_URL="http://openra.net" +PACKAGING_WEBSITE_URL="https://openra.net" # The URL that is displayed in the crash dialog. -PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" +PACKAGING_FAQ_URL="https://wiki.openra.net/FAQ" # The human-readable project authors. # This is used in: diff --git a/packaging/functions.sh b/packaging/functions.sh index fef9189d8..64b9524f4 100644 --- a/packaging/functions.sh +++ b/packaging/functions.sh @@ -3,7 +3,7 @@ #### # This file must stay /bin/sh and POSIX compliant for macOS and BSD portability. -# Copy-paste the entire script into http://shellcheck.net to check. +# Copy-paste the entire script into https://shellcheck.net to check. #### # Compile and publish any mod assemblies to the target directory diff --git a/packaging/windows/buildpackage.nsi b/packaging/windows/buildpackage.nsi index c25489684..0155cf11b 100644 --- a/packaging/windows/buildpackage.nsi +++ b/packaging/windows/buildpackage.nsi @@ -12,7 +12,7 @@ ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License -; along with OpenRA. If not, see . +; along with OpenRA. If not, see . !include "MUI2.nsh" From 6c05c66dc03c53c63fa8e571d1fbb56c7ccee1d4 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 01:51:35 +0200 Subject: [PATCH 04/24] Use appimagetool with non-glibc linux support OpenRA PR 21635. --- packaging/linux/buildpackage.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/linux/buildpackage.sh b/packaging/linux/buildpackage.sh index be9fb1933..c8bd0d188 100755 --- a/packaging/linux/buildpackage.sh +++ b/packaging/linux/buildpackage.sh @@ -89,9 +89,9 @@ fi # Add native libraries echo "Downloading appimagetool" if command -v curl >/dev/null 2>&1; then - curl -s -L -O https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3 + curl -s -L -O https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3 else - wget -cq https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3 + wget -cq https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3 fi echo "Building AppImage" From e3bb4ef5931c74fc34edf98d600511ef5d841a70 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 20:42:09 +0200 Subject: [PATCH 05/24] Fix using appimagetool for building for linux OpenRA PR 21648. --- .github/workflows/packaging.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index 98b3d76d5..d7d4167ce 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -28,6 +28,7 @@ jobs: run: | make engine mkdir -p build/linux + sudo apt-get install -y desktop-file-utils ./packaging/linux/buildpackage.sh "${GIT_TAG}" "${PWD}/build/linux" - name: Upload Packages From fb310924be9b0c2dbb9da80f843d0d1a822ef4b3 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 21:55:39 +0200 Subject: [PATCH 06/24] Updated targeted engine version --- mod.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.config b/mod.config index 6f1213ddf..c88deb75d 100644 --- a/mod.config +++ b/mod.config @@ -9,7 +9,7 @@ MOD_ID="example" # The OpenRA engine version to use for this project. -ENGINE_VERSION="release-20231010" +ENGINE_VERSION="release-20250330" ############################################################################## # Packaging From e2ba63d734cba5326494c2b3c967d59b27b3f015 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 21:01:28 +0200 Subject: [PATCH 07/24] Replace hardcoded mod.yaml Packages list with a mod-defined filesystem loader OpenRA PR 21598. --- mods/example/mod.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/example/mod.yaml b/mods/example/mod.yaml index 9ba02d6d0..582e292fb 100644 --- a/mods/example/mod.yaml +++ b/mods/example/mod.yaml @@ -3,17 +3,16 @@ Metadata: Version: {DEV_VERSION} WindowTitle: Example -Packages: - ^EngineDir - $example: example - ^EngineDir|mods/common: common +FileSystem: DefaultFileSystem + Packages: + ^EngineDir + $example: example + ^EngineDir|mods/common: common MapFolders: example|maps: System -Assemblies: - ^BinDir|OpenRA.Mods.Common.dll - ^BinDir|OpenRA.Mods.Example.dll +Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Example.dll AssetBrowser: AudioExtensions: .wav From a34809c2cd5e9ca246b14ef40b92138ca75f06a4 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 21:05:42 +0200 Subject: [PATCH 08/24] Turn ModelRenderer and VoxelCache into traits OpenRA PR 21066. --- mods/example/mod.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/example/mod.yaml b/mods/example/mod.yaml index 582e292fb..a6f4e8800 100644 --- a/mods/example/mod.yaml +++ b/mods/example/mod.yaml @@ -41,8 +41,6 @@ TerrainFormat: DefaultTerrain SpriteSequenceFormat: DefaultSpriteSequence -ModelSequenceFormat: PlaceholderModelSequence - DefaultOrderGenerator: UnitOrderGenerator GameSpeeds: From dfa7fe236215795629d0355d21e4ded37f0c207d Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 21:55:10 +0200 Subject: [PATCH 09/24] Reworked Fluent file path and yaml references OpenRA PR 21622. --- mods/example/{languages/en.ftl => fluent/chrome.ftl} | 0 mods/example/mod.chrome.yaml | 9 ++++++--- 2 files changed, 6 insertions(+), 3 deletions(-) rename mods/example/{languages/en.ftl => fluent/chrome.ftl} (100%) diff --git a/mods/example/languages/en.ftl b/mods/example/fluent/chrome.ftl similarity index 100% rename from mods/example/languages/en.ftl rename to mods/example/fluent/chrome.ftl diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index f2bd6002e..e36cc00e9 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -103,6 +103,9 @@ Hotkeys: common|hotkeys/supportpowers.yaml common|hotkeys/viewport.yaml -Translations: - common|languages/en.ftl - example|languages/en.ftl +FluentMessages: + common|fluent/common.ftl + common|fluent/chrome.ftl + common|fluent/hotkeys.ftl + common|fluent/rules.ftl + example|fluent/chrome.ftl From 50ab9ec00fd458c3971558a1e374089b17316e1d Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 16 Nov 2024 21:55:51 +0200 Subject: [PATCH 10/24] Updated map editor - Part 1 OpenRA PR 20226. --- mods/example/mod.chrome.yaml | 1 - mods/example/rules/world.yaml | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index e36cc00e9..5c070df1a 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -99,7 +99,6 @@ Hotkeys: common|hotkeys/game.yaml common|hotkeys/observer.yaml common|hotkeys/production-common.yaml - common|hotkeys/production-peractor.yaml common|hotkeys/supportpowers.yaml common|hotkeys/viewport.yaml diff --git a/mods/example/rules/world.yaml b/mods/example/rules/world.yaml index 938c250a3..a3177d702 100644 --- a/mods/example/rules/world.yaml +++ b/mods/example/rules/world.yaml @@ -39,6 +39,5 @@ editorworld: EditorActionManager: EditorActorLayer: EditorCursorLayer: - EditorSelectionLayer: - Palette: + MarkerLayerOverlay: TerrainGeometryOverlay: From 194f0ceb783027355779652f9b1d608cd04140c2 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 18:14:50 +0200 Subject: [PATCH 11/24] Ran automatic extraction of chrome strings OpenRA PR 21134. Run utility command --extract-chrome-strings. NOTE: This expects that there is a /fluent folder with a /chrome.ftl file in your mod! --- mods/example/chrome/ingame-observer.yaml | 24 ++++++++++++------------ mods/example/fluent/chrome.ftl | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/mods/example/chrome/ingame-observer.yaml b/mods/example/chrome/ingame-observer.yaml index 0cde94c2f..ec0b2d501 100644 --- a/mods/example/chrome/ingame-observer.yaml +++ b/mods/example/chrome/ingame-observer.yaml @@ -21,14 +21,14 @@ Container@OBSERVER_WIDGETS: Width: PARENT_RIGHT - 30 Height: 25 Align: Right - Text: Audio Muted + Text: label-mute-indicator Contrast: true MenuButton@OPTIONS_BUTTON: X: 5 Y: 5 Width: 160 Height: 25 - Text: Options (Esc) + Text: button-observer-widgets-options Font: Bold Key: escape DisableWorldSounds: true @@ -116,7 +116,7 @@ Container@OBSERVER_WIDGETS: Width: 26 Height: 26 Key: Pause - TooltipText: Pause + TooltipText: button-replay-player-pause-tooltip TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: @@ -131,7 +131,7 @@ Container@OBSERVER_WIDGETS: Width: 26 Height: 26 Key: Pause - TooltipText: Play + TooltipText: button-replay-player-play-tooltip TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: @@ -146,9 +146,9 @@ Container@OBSERVER_WIDGETS: Width: 36 Height: 20 Key: ReplaySpeedSlow - TooltipText: Slow speed + TooltipText: button-replay-player-slow.tooltip TooltipContainer: TOOLTIP_CONTAINER - Text: 50% + Text: button-replay-player-slow.label Font: TinyBold Button@BUTTON_REGULAR: X: 55 + 45 @@ -156,9 +156,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 Key: ReplaySpeedRegular - TooltipText: Regular speed + TooltipText: button-replay-player-regular.tooltip TooltipContainer: TOOLTIP_CONTAINER - Text: 100% + Text: button-replay-player-regular.label Font: TinyBold Button@BUTTON_FAST: X: 55 + 45 * 2 @@ -166,9 +166,9 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 Key: ReplaySpeedFast - TooltipText: Fast speed + TooltipText: button-replay-player-fast.tooltip TooltipContainer: TOOLTIP_CONTAINER - Text: 200% + Text: button-replay-player-fast.label Font: TinyBold Button@BUTTON_MAXIMUM: X: 55 + 45 * 3 @@ -176,7 +176,7 @@ Container@OBSERVER_WIDGETS: Width: 38 Height: 20 Key: ReplaySpeedMax - TooltipText: Maximum speed + TooltipText: button-replay-player-maximum.tooltip TooltipContainer: TOOLTIP_CONTAINER - Text: MAX + Text: button-replay-player-maximum.label Font: TinyBold diff --git a/mods/example/fluent/chrome.ftl b/mods/example/fluent/chrome.ftl index 8dfd7517f..443efcd2a 100644 --- a/mods/example/fluent/chrome.ftl +++ b/mods/example/fluent/chrome.ftl @@ -28,3 +28,25 @@ options-starting-units = options-difficulty = .normal = Normal + +## ingame-observer.yaml +label-mute-indicator = Audio Muted +button-observer-widgets-options = Options (Esc) +button-replay-player-pause-tooltip = Pause +button-replay-player-play-tooltip = Play + +button-replay-player-slow = + .tooltip = Slow speed + .label = 50% + +button-replay-player-regular = + .tooltip = Regular speed + .label = 100% + +button-replay-player-fast = + .tooltip = Fast speed + .label = 200% + +button-replay-player-maximum = + .tooltip = Maximum speed + .label = MAX From 0cd07cb0910d82f099672499c2420c910fa657af Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 18:24:52 +0200 Subject: [PATCH 12/24] Added faction dropdown translations OpenRA PR 21484. --- mods/example/fluent/rules.ftl | 10 ++++++++++ mods/example/mod.chrome.yaml | 1 + mods/example/rules/world.yaml | 6 ++++-- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 mods/example/fluent/rules.ftl diff --git a/mods/example/fluent/rules.ftl b/mods/example/fluent/rules.ftl new file mode 100644 index 000000000..1bca9a0a6 --- /dev/null +++ b/mods/example/fluent/rules.ftl @@ -0,0 +1,10 @@ +## world.yaml +faction-random = + .name = Random + .description = Random Faction + A random faction will be chosen when the game starts. + +faction-example = + .name = Example + .description = Example Faction + Provide your own faction description here. diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index 5c070df1a..6ca8715a7 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -108,3 +108,4 @@ FluentMessages: common|fluent/hotkeys.ftl common|fluent/rules.ftl example|fluent/chrome.ftl + example|fluent/rules.ftl diff --git a/mods/example/rules/world.yaml b/mods/example/rules/world.yaml index a3177d702..ec76b450a 100644 --- a/mods/example/rules/world.yaml +++ b/mods/example/rules/world.yaml @@ -5,11 +5,13 @@ ControlGroups: Faction@Random: InternalName: Random - Name: Random + Name: faction-random.name RandomFactionMembers: example + Description: faction-random.description Faction@example: InternalName: example - Name: Example + Name: faction-example.name + Description: faction-example.description LoadWidgetAtGameStart: MusicPlaylist: ScreenMap: From 59015a5a1b974686ceb10336a2566718784658d0 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 18:33:11 +0200 Subject: [PATCH 13/24] Added mod metadata translations OpenRA PR 21601. --- mods/example/fluent/mod.ftl | 3 +++ mods/example/mod.chrome.yaml | 1 + mods/example/mod.yaml | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 mods/example/fluent/mod.ftl diff --git a/mods/example/fluent/mod.ftl b/mods/example/fluent/mod.ftl new file mode 100644 index 000000000..77ca3111c --- /dev/null +++ b/mods/example/fluent/mod.ftl @@ -0,0 +1,3 @@ +## Metadata +mod-title = Example mod +mod-windowtitle = Example diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index 6ca8715a7..d3ae0a500 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -107,5 +107,6 @@ FluentMessages: common|fluent/chrome.ftl common|fluent/hotkeys.ftl common|fluent/rules.ftl + example|fluent/mod.ftl example|fluent/chrome.ftl example|fluent/rules.ftl diff --git a/mods/example/mod.yaml b/mods/example/mod.yaml index a6f4e8800..95f2d058e 100644 --- a/mods/example/mod.yaml +++ b/mods/example/mod.yaml @@ -1,7 +1,7 @@ Metadata: - Title: Example mod + Title: mod-title Version: {DEV_VERSION} - WindowTitle: Example + WindowTitle: mod-windowtitle FileSystem: DefaultFileSystem Packages: From 60588e8763453b03d86d5dbd9b101997b478f6cd Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 18:39:15 +0200 Subject: [PATCH 14/24] Misc translation fixes --- mods/example/fluent/chrome.ftl | 3 --- mods/example/fluent/mod.ftl | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/example/fluent/chrome.ftl b/mods/example/fluent/chrome.ftl index 443efcd2a..921305efe 100644 --- a/mods/example/fluent/chrome.ftl +++ b/mods/example/fluent/chrome.ftl @@ -26,9 +26,6 @@ dropdown-starting-units = options-starting-units = .unlabeled = Unlabeled -options-difficulty = - .normal = Normal - ## ingame-observer.yaml label-mute-indicator = Audio Muted button-observer-widgets-options = Options (Esc) diff --git a/mods/example/fluent/mod.ftl b/mods/example/fluent/mod.ftl index 77ca3111c..ee8191b8b 100644 --- a/mods/example/fluent/mod.ftl +++ b/mods/example/fluent/mod.ftl @@ -1,3 +1,7 @@ ## Metadata mod-title = Example mod mod-windowtitle = Example + +# To silence "Warning: Missing key `loadscreen-loading` in mod ftl files required by `LogoStripeLoadScreen.Loading`" +# Because https://github.com/OpenRA/OpenRA/issues/20693 wasn't fixed. +loadscreen-loading = . From 2f7b47ff9af0064c8164fc9b1003388e2efddad4 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 20:15:02 +0200 Subject: [PATCH 15/24] Ran the Utility's update-mod command utility example --update-mod release-20231010 --detailed --apply --- mods/example/chrome/ingame-observer.yaml | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/mods/example/chrome/ingame-observer.yaml b/mods/example/chrome/ingame-observer.yaml index ec0b2d501..e50bebdc4 100644 --- a/mods/example/chrome/ingame-observer.yaml +++ b/mods/example/chrome/ingame-observer.yaml @@ -5,20 +5,20 @@ Container@OBSERVER_WIDGETS: LogicKeyListener@OBSERVER_KEY_LISTENER: Container@MUTE_INDICATOR: Logic: MuteIndicatorLogic - X: WINDOW_RIGHT - WIDTH - 260 + X: WINDOW_WIDTH - WIDTH - 260 Y: 5 Width: 200 Height: 25 Children: Image@ICON: - X: PARENT_RIGHT - WIDTH + X: PARENT_WIDTH - WIDTH Y: 1 Width: 24 Height: 24 ImageCollection: sidebar-bits ImageName: indicator-muted Label@LABEL: - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 25 Align: Right Text: label-mute-indicator @@ -34,12 +34,12 @@ Container@OBSERVER_WIDGETS: DisableWorldSounds: true Container@GAME_TIMER_BLOCK: Logic: GameTimerLogic - X: (WINDOW_RIGHT - WIDTH) / 2 + X: (WINDOW_WIDTH - WIDTH) / 2 Width: 100 Height: 55 Children: LabelWithTooltip@GAME_TIMER: - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 30 Align: Center Font: Title @@ -48,13 +48,13 @@ Container@OBSERVER_WIDGETS: TooltipTemplate: SIMPLE_TOOLTIP Label@GAME_TIMER_STATUS: Y: 32 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 15 Align: Center Font: Bold Contrast: true Background@RADAR_BG: - X: WINDOW_RIGHT - 255 + X: WINDOW_WIDTH - 255 Y: 5 Width: 250 Height: 250 @@ -62,17 +62,17 @@ Container@OBSERVER_WIDGETS: Radar@INGAME_RADAR: X: 10 Y: 10 - Width: PARENT_RIGHT - 19 - Height: PARENT_BOTTOM - 19 + Width: PARENT_WIDTH - 19 + Height: PARENT_HEIGHT - 19 WorldInteractionController: INTERACTION_CONTROLLER VideoPlayer@PLAYER: X: 10 Y: 10 - Width: PARENT_RIGHT - 20 - Height: PARENT_BOTTOM - 20 + Width: PARENT_WIDTH - 20 + Height: PARENT_HEIGHT - 20 Skippable: false Background@OBSERVER_CONTROL_BG: - X: WINDOW_RIGHT - 255 + X: WINDOW_WIDTH - 255 Y: 260 Width: 250 Height: 55 @@ -95,12 +95,12 @@ Container@OBSERVER_WIDGETS: Y: 5 Label@LABEL: X: 34 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 25 Shadow: True Label@NOFLAG_LABEL: X: 5 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 25 Shadow: True Container@REPLAY_PLAYER: From cf94acbc6c2d665c009e1c70e4c89fa2eb12db0c Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 20:25:33 +0200 Subject: [PATCH 16/24] Misc mod.yaml updates These should be the final changes to mod.yaml. --- mods/example/mod.chrome.yaml | 2 ++ mods/example/mod.yaml | 1 + 2 files changed, 3 insertions(+) diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index d3ae0a500..1f88312f5 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -110,3 +110,5 @@ FluentMessages: example|fluent/mod.ftl example|fluent/chrome.ftl example|fluent/rules.ftl + +AllowUnusedFluentMessagesInExternalPackages: false diff --git a/mods/example/mod.yaml b/mods/example/mod.yaml index 95f2d058e..25c8ef9dd 100644 --- a/mods/example/mod.yaml +++ b/mods/example/mod.yaml @@ -25,6 +25,7 @@ LoadScreen: BlankLoadScreen ServerTraits: LobbyCommands + SkirmishLogic PlayerPinger MasterServerPinger LobbySettingsNotification From 3b576bc77193d25b5bf2daf1536458b24116c153 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 21:05:26 +0200 Subject: [PATCH 17/24] Updated map editor - Part 2 OpenRA PRs 20226, 21317 and 21318, but only partially. --- mods/example/chrome/chrome.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mods/example/chrome/chrome.yaml b/mods/example/chrome/chrome.yaml index 95c17c2bf..67bdb7daf 100644 --- a/mods/example/chrome/chrome.yaml +++ b/mods/example/chrome/chrome.yaml @@ -378,3 +378,14 @@ dropdown-separators: separator: Inherits: button + +editor: + Inherits: ^Glyphs + Regions: + select: 34, 187, 16, 16 + tiles: 0, 187, 16, 16 + overlays: 17, 187, 16, 16 + actors: 34, 68, 16, 16 + tools: 136, 68, 16, 16 + history: 136, 51, 16, 16 + erase: 50, 187, 16, 16 From 173f57fd415aafe31186a9873ff25b78e13e98e5 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 24 Nov 2024 21:28:13 +0200 Subject: [PATCH 18/24] Sweep unused translation key warnings under the rug --- mods/example/mod.chrome.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/example/mod.chrome.yaml b/mods/example/mod.chrome.yaml index 1f88312f5..84b29bea8 100644 --- a/mods/example/mod.chrome.yaml +++ b/mods/example/mod.chrome.yaml @@ -111,4 +111,4 @@ FluentMessages: example|fluent/chrome.ftl example|fluent/rules.ftl -AllowUnusedFluentMessagesInExternalPackages: false +AllowUnusedFluentMessagesInExternalPackages: true From bc55b60fc6f47c85f5fc424ba0f2ce2563135c8e Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 31 Mar 2025 02:41:38 +0300 Subject: [PATCH 19/24] Adjusted Fluent files to 4-space indentation OpenRA PR 21750. --- mods/example/fluent/chrome.ftl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/example/fluent/chrome.ftl b/mods/example/fluent/chrome.ftl index 921305efe..dcdf03da0 100644 --- a/mods/example/fluent/chrome.ftl +++ b/mods/example/fluent/chrome.ftl @@ -33,17 +33,17 @@ button-replay-player-pause-tooltip = Pause button-replay-player-play-tooltip = Play button-replay-player-slow = - .tooltip = Slow speed - .label = 50% + .tooltip = Slow speed + .label = 50% button-replay-player-regular = - .tooltip = Regular speed - .label = 100% + .tooltip = Regular speed + .label = 100% button-replay-player-fast = - .tooltip = Fast speed - .label = 200% + .tooltip = Fast speed + .label = 200% button-replay-player-maximum = - .tooltip = Maximum speed - .label = MAX + .tooltip = Maximum speed + .label = MAX From 50de382c6b7eebeaee361c63d3ef1f2f8adfd176 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 31 Mar 2025 02:45:01 +0300 Subject: [PATCH 20/24] Fix .NET 6 CI false positives OpenRA PR 21769. --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 770f889e7..afdbbbcda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,9 @@ jobs: runs-on: ubuntu-22.04 steps: + - name: Remove System .NET + run: sudo apt-get remove -y dotnet* + - name: Clone Repository uses: actions/checkout@v4 From 11d2d1e38394b390d0fa009e2fdde3af57a11074 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 31 Mar 2025 02:54:56 +0300 Subject: [PATCH 21/24] Avoid a third-party GH Actions OpenRA PR 21805. --- .github/workflows/packaging.yml | 36 ++++++++++++++------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index d7d4167ce..2d16803a5 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -32,13 +32,11 @@ jobs: ./packaging/linux/buildpackage.sh "${GIT_TAG}" "${PWD}/build/linux" - name: Upload Packages - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/linux/* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/linux/* macos: name: macOS Disk Image @@ -68,13 +66,11 @@ jobs: ./packaging/macos/buildpackage.sh "${GIT_TAG}" "${PWD}/build/macos" - name: Upload Package - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/macos/* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/macos/* windows: name: Windows Installers @@ -101,10 +97,8 @@ jobs: ./packaging/windows/buildpackage.sh "${GIT_TAG}" "${PWD}/build/windows" - name: Upload Packages - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - overwrite: true - file_glob: true - file: build/windows/* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + gh release upload ${{ github.ref_name }} build/windows/* From 8dd9f3dbb6d5717c47b6d4ef6e6c6d5f77abd4cd Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 6 Apr 2025 21:07:32 +0300 Subject: [PATCH 22/24] Update Dedicated-Server wiki page URL OpenRA PR 20783. --- launch-dedicated.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launch-dedicated.cmd b/launch-dedicated.cmd index 3c5fa303a..c346a9574 100644 --- a/launch-dedicated.cmd +++ b/launch-dedicated.cmd @@ -1,4 +1,4 @@ -:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated for details +:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated-Server for details @echo on From 9dc5725390e725298e4e3bf423a078b18bc5aa3c Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 8 Apr 2025 21:00:49 +0300 Subject: [PATCH 23/24] HACK Remove FluentReferences lint check from the engine --- fetch-engine.sh | 4 ++++ make.ps1 | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/fetch-engine.sh b/fetch-engine.sh index 5850bba0c..8b4ca0f19 100755 --- a/fetch-engine.sh +++ b/fetch-engine.sh @@ -74,6 +74,10 @@ if [ "${AUTOMATIC_ENGINE_MANAGEMENT}" = "True" ]; then rmdir "${AUTOMATIC_ENGINE_EXTRACT_DIRECTORY}" rm "${AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME}" + # HACK: Remove bogus lint check that the Example mod can't possibly pass + # because to do so it would need to define a lot of excess things surrounding resources. + rm ${ENGINE_DIRECTORY}/OpenRA.Mods.Common/Lint/CheckFluentReferences.cs + echo "Compiling engine..." cd "${ENGINE_DIRECTORY}" || exit 1 make version VERSION="${ENGINE_VERSION}" diff --git a/make.ps1 b/make.ps1 index 548adbee3..8dad44fe3 100644 --- a/make.ps1 +++ b/make.ps1 @@ -367,6 +367,10 @@ if ($command -eq "all" -or $command -eq "clean" -or $command -eq "check") rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r + # HACK: Remove bogus lint check that the Example mod can't possibly pass + # because to do so it would need to define a lot of excess things surrounding resources. + rm $env:ENGINE_DIRECTORY/OpenRA.Mods.Common/Lint/CheckFluentReferences.cs + cd $env:ENGINE_DIRECTORY Invoke-Expression ".\make.cmd version $env:ENGINE_VERSION" Invoke-Expression ".\make.cmd $command" From 76dec248593039f1f5f89c444990d8e268ead6eb Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 15:19:56 +0300 Subject: [PATCH 24/24] Updated glyphs.png OpenRA PRs 20226, 21317, 21318 and 21489. --- mods/example/chrome/assets/glyphs.png | Bin 27850 -> 36915 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/example/chrome/assets/glyphs.png b/mods/example/chrome/assets/glyphs.png index bbf02287856c04ba3c3f4ad995fa89337aacaa17..20bd11c09d7c137811204bd0306ebdc72313b5f5 100644 GIT binary patch literal 36915 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

O}KSqdJkh85@Aw)L?D`_ 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