From 55e571d483681311b8b4f36d9195d74d54c27fad Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 16:57:16 +0300 Subject: [PATCH 01/21] Updated .editorconfig Straight-up copied the one from OpenRA ModSDK. --- .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 f6e3d88d385681e7a5dc81312e524f3c638c45a3 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 16:59:53 +0300 Subject: [PATCH 02/21] Updated GitHub workflow As per OpenRA PR 21379. --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 803d6747f..310b29c5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,10 +17,10 @@ jobs: run: sudo apt-get remove -y dotnet* - 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' @@ -46,7 +46,7 @@ jobs: steps: - name: Clone Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Prepare Environment run: | @@ -70,10 +70,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' From 134044e865f811e07704a4c031481edf2db0ba62 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:06:10 +0300 Subject: [PATCH 03/21] Updated all links to HTTPS As per OpenRA PR 21427. --- CODE_OF_CONDUCT.md | 6 +++--- CONTRIBUTING.md | 4 ++-- LICENSE | 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/LICENSE b/LICENSE index 94a9ed024..e60008693 100644 --- a/LICENSE +++ b/LICENSE @@ -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 813550724..7bd9c560d 100644 --- a/mod.config +++ b/mod.config @@ -14,9 +14,9 @@ PACKAGING_INSTALLER_NAME="RA2Mod" PACKAGING_DISPLAY_NAME="Red Alert 2 Mod" -PACKAGING_WEBSITE_URL="http://openra.net" +PACKAGING_WEBSITE_URL="https://openra.net" -PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" +PACKAGING_FAQ_URL="https://wiki.openra.net/FAQ" PACKAGING_AUTHORS="The Red Alert 2 Mod authors" 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 d67cd5a7d3a1c91e3ca8ff813a726d92a60c35bf Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:07:21 +0300 Subject: [PATCH 04/21] 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 88b0c2a64c0f67f0ceff7d97a49d1f40c297e88c Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:11:18 +0300 Subject: [PATCH 05/21] Update targeted engine version to release-20250330 --- mod.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.config b/mod.config index 7bd9c560d..c515da899 100644 --- a/mod.config +++ b/mod.config @@ -4,7 +4,7 @@ MOD_ID="ra2" -ENGINE_VERSION="release-20231010" +ENGINE_VERSION="release-20250330" ########################### # Packaging Configuration # From 77229f45923a4ce2ffec0a2b84656e9d532b436d Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:13:29 +0300 Subject: [PATCH 06/21] Replace hardcoded mod.yaml Packages list with a mod-defined filesystem loader OpenRA PR 21598. --- mods/ra2/mod.yaml | 81 ++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index b828bc306..a63ef5ab3 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -10,42 +10,46 @@ ModCredits: PackageFormats: Mix, AudioBag -Packages: - ~^SupportDir|Content/ra2 - ^EngineDir - $ra2: ra2 - ^EngineDir|mods/common: common - ~ra2.mix - ~language.mix - ~multi.mix - ~audio.mix - ~cache.mix - ~cameo.mix - ~conquer.mix: conquer - ~generic.mix - ~isogen.mix - ~isosnow.mix - ~isotemp.mix - ~isourb.mix - ~load.mix - ~local.mix - ~neutral.mix - ~sidec01.mix - ~sidec02.mix - ~sno.mix - ~snow.mix - ~tem.mix - ~temperat.mix - ~theme.mix - ~urb.mix - ~urban.mix - ~audio.bag - ra2|bits - ra2|bits/cameos - ra2|bits/structures - ra2|bits/animations - ra2|bits/projectiles - ra2|uibits +FileSystem: ContentInstallerFileSystem + SystemPackages: + ^EngineDir + $ra2: ra2 + ^EngineDir|mods/common: common + ~^SupportDir|Content/ra2: content + ContentInstallerMod: ra2-content + ContentPackages: + ra2.mix + language.mix + multi.mix + audio.mix + cache.mix + cameo.mix + conquer.mix: conquer + generic.mix + isogen.mix + isosnow.mix + isotemp.mix + isourb.mix + load.mix + local.mix + neutral.mix + sidec01.mix + sidec02.mix + sno.mix + snow.mix + tem.mix + temperat.mix + urb.mix + urban.mix + audio.bag + ~theme.mix + # Below are mod-provided (system) packages that need to be loaded after the content packages so they can override content assets. + ra2|bits + ra2|bits/cameos + ra2|bits/structures + ra2|bits/animations + ra2|bits/projectiles + ra2|uibits MapFolders: ra2|maps: System @@ -104,10 +108,7 @@ Cursors: Chrome: ra2|chrome.yaml -Assemblies: - ^BinDir|OpenRA.Mods.Common.dll - ^BinDir|OpenRA.Mods.Cnc.dll - ^BinDir|OpenRA.Mods.RA2.dll +Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Cnc.dll, OpenRA.Mods.RA2.dll ChromeLayout: common|chrome/assetbrowser.yaml From d4e96ec08b15b7d667b7a060ff28b5f1d52ddd5b Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:17:53 +0300 Subject: [PATCH 07/21] Turn ModelRenderer and VoxelCache into traits OpenRA PR 21066. --- mods/ra2/mod.yaml | 2 -- mods/ra2/rules/world.yaml | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index a63ef5ab3..614118f6b 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -287,8 +287,6 @@ SpriteSequenceFormat: TilesetSpecificSpriteSequence TilesetSuffixes: SNOW: a -ModelSequenceFormat: VoxelModelSequence - AssetBrowser: SpriteExtensions: .shp, .tem, .urb, .sno ModelExtensions: .vxl diff --git a/mods/ra2/rules/world.yaml b/mods/ra2/rules/world.yaml index 1de62d382..4bb23a54f 100644 --- a/mods/ra2/rules/world.yaml +++ b/mods/ra2/rules/world.yaml @@ -4,6 +4,8 @@ MusicPlaylist: VictoryMusic: score DefeatMusic: score + VoxelCache: + ModelRenderer: ActorMap: ScreenMap: TerrainGeometryOverlay: From bba8aca27b75af9a7110cb244eeb725569135f5f Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:21:57 +0300 Subject: [PATCH 08/21] Reworked Fluent file path and yaml references OpenRA PR 21622. --- mods/ra2/{languages/rules/en.ftl => fluent/rules.ftl} | 0 mods/ra2/mod.yaml | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) rename mods/ra2/{languages/rules/en.ftl => fluent/rules.ftl} (100%) diff --git a/mods/ra2/languages/rules/en.ftl b/mods/ra2/fluent/rules.ftl similarity index 100% rename from mods/ra2/languages/rules/en.ftl rename to mods/ra2/fluent/rules.ftl diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index 614118f6b..d78503435 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -198,10 +198,12 @@ MapGrid: Music: ra2|audio/music.yaml -Translations: - common|languages/en.ftl - common|languages/rules/en.ftl - ra2|languages/rules/en.ftl +FluentMessages: + common|fluent/common.ftl + common|fluent/chrome.ftl + common|fluent/hotkeys.ftl + common|fluent/rules.ftl + ra2|fluent/rules.ftl Hotkeys: common|hotkeys/game.yaml From cf421a55fde548666b00f34437b6dfc07e57a6d2 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 17:28:33 +0300 Subject: [PATCH 09/21] Updated map editor - Part 1 OpenRA PR 20226. --- mods/ra2/rules/world.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ra2/rules/world.yaml b/mods/ra2/rules/world.yaml index 4bb23a54f..a218855db 100644 --- a/mods/ra2/rules/world.yaml +++ b/mods/ra2/rules/world.yaml @@ -395,7 +395,7 @@ EditorWorld: TerrainType: Gems AllowedTerrainTypes: Clear, Rough, Road MaxDensity: 12 - EditorSelectionLayer: + MarkerLayerOverlay: LoadWidgetAtGameStart: EditorActionManager: BuildableTerrainOverlay: From 610966d097933abd2d9de405f95b25119c7da26b Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 20:15:28 +0300 Subject: [PATCH 10/21] Updated custom code to build with the new engine --- OpenRA.Mods.RA2/FileSystem/BagFile.cs | 62 +++++++++--------- OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs | 4 +- .../Traits/ChronoResourceDelivery.cs | 36 +++++------ .../Traits/Render/WithVoxelHelicopterBody.cs | 13 ++-- OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs | 3 +- .../UtilityCommands/ImportRA2MapCommand.cs | 63 +++++++++++-------- 6 files changed, 95 insertions(+), 86 deletions(-) diff --git a/OpenRA.Mods.RA2/FileSystem/BagFile.cs b/OpenRA.Mods.RA2/FileSystem/BagFile.cs index 609407236..0966716e4 100644 --- a/OpenRA.Mods.RA2/FileSystem/BagFile.cs +++ b/OpenRA.Mods.RA2/FileSystem/BagFile.cs @@ -50,19 +50,19 @@ public Stream GetStream(string filename) if ((entry.Flags & 2) > 0) { // PCM - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("RIFF")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length + 36)); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("WAVE")); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fmt ")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(16)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)1)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)channels)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.SampleRate)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(2 * channels * entry.SampleRate)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)(2 * channels))); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)16)); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("data")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("RIFF")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length + 36)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("WAVE")); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fmt ")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(16)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)1)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)channels)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.SampleRate)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(2 * channels * entry.SampleRate)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)(2 * channels))); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)16)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("data")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length)); } if ((entry.Flags & 8) > 0) @@ -72,24 +72,24 @@ public Stream GetStream(string filename) var bytesPerSec = (int)Math.Floor((double)(2 * entry.ChunkSize) / samplesPerChunk * ((double)entry.SampleRate / 2)); var chunkSize = entry.ChunkSize > entry.Length ? entry.Length : entry.ChunkSize; - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("RIFF")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length + 52)); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("WAVE")); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fmt ")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(20)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)17)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)channels)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.SampleRate)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(bytesPerSec)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)chunkSize)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)4)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)2)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes((short)samplesPerChunk)); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("fact")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(4)); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(4 * entry.Length)); - waveHeaderMemoryStream.WriteArray(Encoding.ASCII.GetBytes("data")); - waveHeaderMemoryStream.WriteArray(BitConverter.GetBytes(entry.Length)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("RIFF")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length + 52)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("WAVE")); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fmt ")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(20)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)17)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)channels)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.SampleRate)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(bytesPerSec)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)chunkSize)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)4)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)2)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes((short)samplesPerChunk)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("fact")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(4)); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(4 * entry.Length)); + waveHeaderMemoryStream.Write(Encoding.ASCII.GetBytes("data")); + waveHeaderMemoryStream.Write(BitConverter.GetBytes(entry.Length)); } waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin); diff --git a/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs b/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs index be65ccce8..c32416ebd 100644 --- a/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs +++ b/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs @@ -107,7 +107,9 @@ public void Tick(World world) { // Beam tracks target if (info.TrackTarget && args.GuidedTarget.IsValidFor(args.SourceActor)) - target = args.Weapon.TargetActorCenter ? args.GuidedTarget.CenterPosition : args.GuidedTarget.Positions.PositionClosestTo(source); + target = args.Weapon.TargetActorCenter + ? args.GuidedTarget.CenterPosition + : args.GuidedTarget.Positions.ClosestToIgnoringPath(source); // Check for blocking actors if (info.Blockable && BlocksProjectiles.AnyBlockingActorsBetween(world, args.SourceActor.Owner, source, target, diff --git a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs index cca885a32..7ab46866d 100644 --- a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs +++ b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs @@ -9,7 +9,6 @@ */ #endregion -using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Traits; using OpenRA.Mods.RA2.Activities; using OpenRA.Traits; @@ -46,12 +45,11 @@ public class ChronoResourceDeliveryInfo : TraitInfo, Requires public override object Create(ActorInitializer init) { return new ChronoResourceDelivery(this); } } - public class ChronoResourceDelivery : INotifyHarvesterAction, ITick + public class ChronoResourceDelivery : INotifyHarvestAction, ITick { readonly ChronoResourceDeliveryInfo info; CPos? destination; - Actor refinery; int ticksTillCheck; // TODO: Rewrite this entire thing, possible to be a subclass of harvester @@ -76,28 +74,27 @@ void ITick.Tick(Actor self) ticksTillCheck--; } - void INotifyHarvesterAction.MovingToResources(Actor self, CPos targetCell) - { - Reset(); - } + void INotifyHarvestAction.Harvested(Actor self, string resourceType) { } - void INotifyHarvesterAction.MovingToRefinery(Actor self, Actor refineryActor) + void INotifyHarvestAction.MovingToResources(Actor self, CPos targetCell) { - var iao = refineryActor.Trait(); - var targetCell = self.World.Map.CellContaining(iao.DeliveryPosition); - if (destination != null && destination.Value != targetCell) - ticksTillCheck = 0; - - refinery = refineryActor; - destination = targetCell; + Reset(); } - public void MovementCancelled(Actor self) + void INotifyHarvestAction.MovementCancelled(Actor self) { Reset(); } - public void Harvested(Actor self, string resourceType) { } + // void INotifyHarvestAction.MovingToRefinery(Actor self, Actor refineryActor) + // { + // var iao = refineryActor.Trait(); + // var targetCell = self.World.Map.CellContaining(iao.DeliveryPosition); + // if (destination != null && destination.Value != targetCell) + // ticksTillCheck = 0; + // refinery = refineryActor; + // destination = targetCell; + // } public void Docked() { } public void Undocked() { } @@ -119,8 +116,8 @@ void TeleportIfPossible(Actor self) self.QueueActivity(new ChronoResourceTeleport(dest, info)); // HACK: Manually queue a delivery and new find since we just cancelled all activities - self.QueueActivity(new DeliverResources(self, refinery)); - self.QueueActivity(new FindAndDeliverResources(self, refinery)); + // self.QueueActivity(new DeliverResources(self, refinery)); + // self.QueueActivity(new FindAndDeliverResources(self, refinery)); Reset(); } } @@ -129,7 +126,6 @@ void Reset() { ticksTillCheck = 0; destination = null; - refinery = null; } } } diff --git a/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs b/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs index e7ce7bbc7..f8dae81c6 100644 --- a/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs +++ b/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs @@ -15,14 +15,13 @@ using OpenRA.Mods.Cnc.Traits.Render; using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Traits; -using OpenRA.Mods.Common.Traits.Render; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.RA2.Traits { [Desc("Render an animated voxel based upon the voxel being inair.")] - public class WithVoxelHelicopterBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxelsInfo, Requires + public sealed class WithVoxelHelicopterBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxelsInfo, Requires { public readonly string Sequence = "idle"; @@ -34,20 +33,20 @@ public class WithVoxelHelicopterBodyInfo : ConditionalTraitInfo, IRenderActorPre public override object Create(ActorInitializer init) { return new WithVoxelHelicopterBody(init.Self, this); } - public IEnumerable RenderPreviewVoxels( + public IEnumerable RenderPreviewVoxels(IModelCache cache, ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p) { - var voxel = init.World.ModelCache.GetModelSequence(image, Sequence); + var model = cache.GetModelSequence(image, Sequence); var body = init.Actor.TraitInfo(); var frame = init.GetValue(this, 0); - yield return new ModelAnimation(voxel, () => WVec.Zero, + yield return new ModelAnimation(model, () => WVec.Zero, () => body.QuantizeOrientation(orientation(), facings), () => false, () => frame, ShowShadow); } } - public class WithVoxelHelicopterBody : ConditionalTrait, IAutoMouseBounds, ITick, IActorPreviewInitModifier + public sealed class WithVoxelHelicopterBody : ConditionalTrait, IAutoMouseBounds, ITick, IActorPreviewInitModifier { readonly WithVoxelHelicopterBodyInfo info; readonly RenderVoxels rv; @@ -63,7 +62,7 @@ public WithVoxelHelicopterBody(Actor self, WithVoxelHelicopterBodyInfo info) var body = self.Trait(); rv = self.Trait(); - var voxel = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence); + var voxel = rv.Renderer.ModelCache.GetModelSequence(rv.Image, info.Sequence); frames = voxel.Frames; modelAnimation = new ModelAnimation(voxel, () => WVec.Zero, () => body.QuantizeOrientation(self.Orientation), diff --git a/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs b/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs index 1ff3b7123..d5252882f 100644 --- a/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs +++ b/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs @@ -66,8 +66,7 @@ void Spawn(Actor self) }; var unit = w.CreateActor(true, actorType.ToLowerInvariant(), td); - var mobile = unit.TraitOrDefault(); - mobile?.Nudge(unit); + unit.QueueActivity(new Nudge(w.WorldActor)); } }); } diff --git a/OpenRA.Mods.RA2/UtilityCommands/ImportRA2MapCommand.cs b/OpenRA.Mods.RA2/UtilityCommands/ImportRA2MapCommand.cs index 9fabfb596..bd167b110 100644 --- a/OpenRA.Mods.RA2/UtilityCommands/ImportRA2MapCommand.cs +++ b/OpenRA.Mods.RA2/UtilityCommands/ImportRA2MapCommand.cs @@ -26,8 +26,9 @@ namespace OpenRA.Mods.RA2.UtilityCommands { sealed class ImportRA2MapCommand : IUtilityCommand { - string IUtilityCommand.Name { get { return "--import-ra2-map"; } } - bool IUtilityCommand.ValidateArguments(string[] args) { return args.Length >= 2; } + string IUtilityCommand.Name => "--import-ra2-map"; + + bool IUtilityCommand.ValidateArguments(string[] args) => args.Length >= 2; static readonly Dictionary OverlayToActor = new() { @@ -443,10 +444,12 @@ static void ReadTiles(Map map, IniFile file, int2 fullSize) var rx = mf.ReadUInt16(); var ry = mf.ReadUInt16(); var tilenum = mf.ReadUInt16(); - /*var zero1 = */mf.ReadInt16(); + /*var zero1 = */ + mf.ReadInt16(); var subtile = mf.ReadUInt8(); var z = mf.ReadUInt8(); - /*var zero2 = */mf.ReadUInt8(); + /*var zero2 = */ + mf.ReadUInt8(); var dx = rx - ry + fullSize.X - 1; var dy = rx + ry - fullSize.X - 1; @@ -498,6 +501,7 @@ static void ReadOverlay(Map map, IniFile file, int2 fullSize) } } + var nodes = new List(); foreach (var cell in map.AllCells) { var overlayType = overlayPack[overlayIndex[cell]]; @@ -514,14 +518,14 @@ static void ReadOverlay(Map map, IniFile file, int2 fullSize) { // Only import the top-left cell of multi-celled overlays var aboveType = overlayPack[overlayIndex[cell - new CVec(1, 0)]]; - if (shape.Width > 1 && aboveType != 0xFF) - if (OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType) - continue; + if (shape.Width > 1 && aboveType != 0xFF + && OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType) + continue; var leftType = overlayPack[overlayIndex[cell - new CVec(0, 1)]]; - if (shape.Height > 1 && leftType != 0xFF) - if (OverlayToActor.TryGetValue(leftType, out var a) && a == actorType) - continue; + if (shape.Height > 1 && leftType != 0xFF + && OverlayToActor.TryGetValue(leftType, out var b) && b == actorType) + continue; } var ar = new ActorReference(actorType) @@ -544,7 +548,7 @@ static void ReadOverlay(Map map, IniFile file, int2 fullSize) ar.Add(new HealthInit(health)); } - map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save())); + nodes.Add(new MiniYamlNode("Actor" + (map.ActorDefinitions.Count + nodes.Count), ar.Save())); continue; } @@ -562,14 +566,17 @@ static void ReadOverlay(Map map, IniFile file, int2 fullSize) Console.WriteLine($"{cell} unknown overlay {overlayType}"); } + + map.ActorDefinitions = map.ActorDefinitions.Concat(nodes).ToArray(); } static void ReadWaypoints(Map map, IniFile file, int2 fullSize) { + var nodes = new List(); var waypointsSection = file.GetSection("Waypoints", true); foreach (var kv in waypointsSection) { - var pos = int.Parse(kv.Value); + var pos = Exts.ParseInt32Invariant(kv.Value); var ry = pos / 1000; var rx = pos - ry * 1000; var dx = rx - ry + fullSize.X - 1; @@ -582,16 +589,19 @@ static void ReadWaypoints(Map map, IniFile file, int2 fullSize) new OwnerInit("Neutral") }; - map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save())); + nodes.Add(new MiniYamlNode("Actor" + (map.ActorDefinitions.Count + nodes.Count), ar.Save())); } + + map.ActorDefinitions = map.ActorDefinitions.Concat(nodes).ToArray(); } static void ReadTerrainActors(Map map, IniFile file, int2 fullSize) { + var nodes = new List(); var terrainSection = file.GetSection("Terrain", true); foreach (var kv in terrainSection) { - var pos = int.Parse(kv.Key); + var pos = Exts.ParseInt32Invariant(kv.Key); var ry = pos / 1000; var rx = pos - ry * 1000; var dx = rx - ry + fullSize.X - 1; @@ -611,24 +621,28 @@ static void ReadTerrainActors(Map map, IniFile file, int2 fullSize) if (!map.Rules.Actors.ContainsKey(name)) Console.WriteLine($"Ignoring unknown actor type: `{name}`"); else - map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save())); + nodes.Add(new MiniYamlNode("Actor" + (map.ActorDefinitions.Count + nodes.Count), ar.Save())); } + + map.ActorDefinitions = map.ActorDefinitions.Concat(nodes).ToArray(); } static void ReadActors(Map map, IniFile file, string type, int2 fullSize) { + var nodes = new List(); var structuresSection = file.GetSection(type, true); foreach (var kv in structuresSection) { - var isDeployed = false; + // TODO: Add back isDeployed, + // or better yet rewrite the whole thing to inherit from ImportGen2MapCommand. var entries = kv.Value.Split(','); var name = entries[1].ToLowerInvariant(); - var health = short.Parse(entries[2]); - var rx = int.Parse(entries[3]); - var ry = int.Parse(entries[4]); - var facing = (byte)(224 - byte.Parse(entries[type == "Infantry" ? 7 : 5])); + var health = Exts.ParseInt16Invariant(entries[2]); + var rx = Exts.ParseInt32Invariant(entries[3]); + var ry = Exts.ParseInt32Invariant(entries[4]); + var facing = (byte)(224 - Exts.ParseByteInvariant(entries[type == "Infantry" ? 7 : 5])); var dx = rx - ry + fullSize.X - 1; var dy = rx + ry - fullSize.X - 1; @@ -643,7 +657,7 @@ static void ReadActors(Map map, IniFile file, string type, int2 fullSize) if (type == "Infantry") { var subcell = 0; - switch (byte.Parse(entries[5])) + switch (Exts.ParseByteInvariant(entries[5])) { case 2: subcell = 3; break; case 3: subcell = 1; break; @@ -659,14 +673,13 @@ static void ReadActors(Map map, IniFile file, string type, int2 fullSize) ar.Add(new FacingInit(WAngle.FromFacing(facing))); - if (isDeployed) - ar.Add(new DeployStateInit(DeployState.Deployed)); - if (!map.Rules.Actors.ContainsKey(name)) Console.WriteLine($"Ignoring unknown actor type: `{name}`"); else - map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save())); + nodes.Add(new MiniYamlNode("Actor" + (map.ActorDefinitions.Count + nodes.Count), ar.Save())); } + + map.ActorDefinitions = map.ActorDefinitions.Concat(nodes).ToArray(); } static void ReadLighting(Map map, IniFile file) From 5db0c455b48e88ca86fd6d96e76071a5db7f8bb3 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 20:22:58 +0300 Subject: [PATCH 11/21] Updated custom code to match OpenRA code style --- OpenRA.Mods.RA2/FileSystem/BagFile.cs | 5 +++-- OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs | 2 +- OpenRA.Mods.RA2/Projectiles/RadBeam.cs | 7 ++++--- OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs | 4 ++-- OpenRA.Mods.RA2/Traits/MindController.cs | 12 +++++------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/OpenRA.Mods.RA2/FileSystem/BagFile.cs b/OpenRA.Mods.RA2/FileSystem/BagFile.cs index 0966716e4..399a935dd 100644 --- a/OpenRA.Mods.RA2/FileSystem/BagFile.cs +++ b/OpenRA.Mods.RA2/FileSystem/BagFile.cs @@ -20,11 +20,12 @@ namespace OpenRA.Mods.Cnc.FileSystem { - public class AudioBagLoader : IPackageLoader + public sealed class AudioBagLoader : IPackageLoader { sealed class BagFile : IReadOnlyPackage { - public string Name { get; private set; } + public string Name { get; } + public IEnumerable Contents => index.Keys; readonly Stream s; diff --git a/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs b/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs index 7dadb6f00..321784592 100644 --- a/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs +++ b/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs @@ -61,7 +61,7 @@ public void Render(WorldRenderer wr) var cycleCount = sourceToTarget.Length / wavelength.Length; if (sourceToTarget.Length % wavelength.Length != 0) - cycleCount += 1; // I'm emulating Math.Ceil + cycleCount++; // I'm emulating Math.Ceil var screenWidth = wr.ScreenVector(new WVec(width, WDist.Zero, WDist.Zero))[0]; diff --git a/OpenRA.Mods.RA2/Projectiles/RadBeam.cs b/OpenRA.Mods.RA2/Projectiles/RadBeam.cs index 1c2ce4a28..913dcab5a 100644 --- a/OpenRA.Mods.RA2/Projectiles/RadBeam.cs +++ b/OpenRA.Mods.RA2/Projectiles/RadBeam.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA2.Projectiles { [Desc("Not a sprite, but an engine effect.")] - public class RadBeamInfo : IProjectileInfo + public sealed class RadBeamInfo : IProjectileInfo { [Desc("The thickness of the beam.")] public readonly WDist Thickness = new(16); @@ -62,7 +62,7 @@ public IProjectile Create(ProjectileArgs args) } } - public class RadBeam : IProjectile + public sealed class RadBeam : IProjectile { readonly ProjectileArgs args; readonly RadBeamInfo info; @@ -117,7 +117,8 @@ public IEnumerable Render(WorldRenderer wr) ? info.Amplitude * ticks / info.BeamDuration : info.Amplitude; - yield return new RadBeamRenderable(args.Source, info.ZOffset, target - args.Source, info.Thickness, info.Color, amp, info.WaveLength, info.QuantizationCount); + yield return new RadBeamRenderable(args.Source, info.ZOffset, target - args.Source, + info.Thickness, info.Color, amp, info.WaveLength, info.QuantizationCount); } if (hitanim != null) diff --git a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs index 7ab46866d..e238437e7 100644 --- a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs +++ b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs @@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA2.Traits { [Desc("When returning to a refinery to deliver resources, this actor will teleport if possible.")] - public class ChronoResourceDeliveryInfo : TraitInfo, Requires + public sealed class ChronoResourceDeliveryInfo : TraitInfo, Requires { [Desc("The number of ticks between each check to see if we can teleport to the refinery.")] public readonly int CheckTeleportDelay = 10; @@ -45,7 +45,7 @@ public class ChronoResourceDeliveryInfo : TraitInfo, Requires public override object Create(ActorInitializer init) { return new ChronoResourceDelivery(this); } } - public class ChronoResourceDelivery : INotifyHarvestAction, ITick + public sealed class ChronoResourceDelivery : INotifyHarvestAction, ITick { readonly ChronoResourceDeliveryInfo info; diff --git a/OpenRA.Mods.RA2/Traits/MindController.cs b/OpenRA.Mods.RA2/Traits/MindController.cs index 1826d5d69..a56829aef 100644 --- a/OpenRA.Mods.RA2/Traits/MindController.cs +++ b/OpenRA.Mods.RA2/Traits/MindController.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA2.Traits { [Desc("This actor can mind control other actors.")] - public class MindControllerInfo : PausableConditionalTraitInfo, Requires, Requires + public sealed class MindControllerInfo : PausableConditionalTraitInfo, Requires, Requires { [Desc("Name of the armaments that grant this condition.")] public readonly HashSet ArmamentNames = new() { "primary" }; @@ -30,7 +30,8 @@ public class MindControllerInfo : PausableConditionalTraitInfo, Requires, INotifyAttack, INotifyKilled, INotifyActorDisposing + public sealed class MindController : PausableConditionalTrait, INotifyAttack, INotifyKilled, INotifyActorDisposing { readonly List slaves = new(); @@ -70,11 +71,8 @@ void UnstackControllingCondition(Actor self, string condition) public void UnlinkSlave(Actor self, Actor slave) { - if (slaves.Contains(slave)) - { - slaves.Remove(slave); + if (slaves.Remove(slave)) UnstackControllingCondition(self, Info.ControllingCondition); - } } void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { } From d7b3739796d57632938e12078ae00347d59300f5 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 21:25:22 +0300 Subject: [PATCH 12/21] Manual mod updates PART 1 - mod.yaml - Move Voxel assets browser preview definitions from common to TS (OpenRA PR 21118). - Persist skirmish settings between sessions (OpenRA PR 21206). - Prevent community mods from warning on unused translations in the common assets (OpenRA PRs 21503, 21622). - Expose mod.yaml content to localisation (OpenRA PR 21601). --- mods/ra2/fluent/mod.ftl | 6 ++++++ mods/ra2/mod.yaml | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 mods/ra2/fluent/mod.ftl diff --git a/mods/ra2/fluent/mod.ftl b/mods/ra2/fluent/mod.ftl new file mode 100644 index 000000000..25ded26d2 --- /dev/null +++ b/mods/ra2/fluent/mod.ftl @@ -0,0 +1,6 @@ +## Metadata +mod-title = Red Alert 2 +mod-windowtitle = OpenRA - Red Alert 2 + +## LogoStripeLoadScreen +loadscreen-loading = Carving wooden nickels..., Preparing paratroopers..., Welcoming you to Texas..., Optimizing helium mix..., Receiving thoughts..., Igniting boosters... diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index d78503435..0735ef39d 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -1,8 +1,9 @@ Metadata: - Title: Red Alert 2 + Title: mod-title Description: The Soviet Union is back!\nThis time to conquer the United States... Version: {DEV_VERSION} Author: the RA2 mod team + WindowTitle: mod-windowtitle ModCredits: ModTabTitle: Red Alert 2 @@ -14,6 +15,7 @@ FileSystem: ContentInstallerFileSystem SystemPackages: ^EngineDir $ra2: ra2 + $ts: ts ^EngineDir|mods/common: common ~^SupportDir|Content/ra2: content ContentInstallerMod: ra2-content @@ -111,7 +113,7 @@ Chrome: Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Cnc.dll, OpenRA.Mods.RA2.dll ChromeLayout: - common|chrome/assetbrowser.yaml + ts|chrome/assetbrowser.yaml ra2|chrome/ingame-player.yaml common|chrome/mainmenu.yaml common|chrome/mainmenu-prompts.yaml @@ -203,8 +205,11 @@ FluentMessages: common|fluent/chrome.ftl common|fluent/hotkeys.ftl common|fluent/rules.ftl + ra2|fluent/mod.ftl ra2|fluent/rules.ftl +AllowUnusedFluentMessagesInExternalPackages: false + Hotkeys: common|hotkeys/game.yaml common|hotkeys/observer.yaml @@ -218,10 +223,10 @@ Hotkeys: LoadScreen: LogoStripeLoadScreen Image: ra2|uibits/loadscreen.png - Text: Carving wooden nickels..., Preparing paratroopers..., Welcoming you to Texas..., Optimizing helium mix..., Receiving thoughts..., Igniting boosters... ServerTraits: LobbyCommands + SkirmishLogic PlayerPinger MasterServerPinger LobbySettingsNotification From ce88fc95a4ff6d15d99cf2bd5432717bcdfa5f83 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 21:49:11 +0300 Subject: [PATCH 13/21] Rework mod content installation OpenRA PR 21623. --- mods/ra2-content/fluent/chrome.ftl | 8 ++ .../installer/firstdecade.yaml | 0 .../installer/origin.yaml | 4 +- .../installer/ra2-disk.yaml} | 6 +- mods/ra2-content/mod.yaml | 104 ++++++++++++++++++ mods/ra2/mod.yaml | 20 ---- 6 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 mods/ra2-content/fluent/chrome.ftl rename mods/{ra2 => ra2-content}/installer/firstdecade.yaml (100%) rename mods/{ra2 => ra2-content}/installer/origin.yaml (92%) rename mods/{ra2/installer/ra2.yaml => ra2-content/installer/ra2-disk.yaml} (79%) create mode 100644 mods/ra2-content/mod.yaml diff --git a/mods/ra2-content/fluent/chrome.ftl b/mods/ra2-content/fluent/chrome.ftl new file mode 100644 index 000000000..ed38b4fce --- /dev/null +++ b/mods/ra2-content/fluent/chrome.ftl @@ -0,0 +1,8 @@ +modcontent-installprompt = + Red Alert 2 requires artwork and audio files from the original game. + + Advanced Install includes options for copying the music, videos, and other content from an original game disc or digital installation. +modcontent-header = + Game content may be extracted from the original game discs or an existing digital install. +modcontent-package-basefiles = Base Game Files +modcontent-package-music = Game Music diff --git a/mods/ra2/installer/firstdecade.yaml b/mods/ra2-content/installer/firstdecade.yaml similarity index 100% rename from mods/ra2/installer/firstdecade.yaml rename to mods/ra2-content/installer/firstdecade.yaml diff --git a/mods/ra2/installer/origin.yaml b/mods/ra2-content/installer/origin.yaml similarity index 92% rename from mods/ra2/installer/origin.yaml rename to mods/ra2-content/installer/origin.yaml index c1305d270..5be2e1e7f 100644 --- a/mods/ra2/installer/origin.yaml +++ b/mods/ra2-content/installer/origin.yaml @@ -7,14 +7,14 @@ origin: C&C The Ultimate Collection (Origin version, English) theme.mix: 184f99e3292ab19c71c08a1ad7097ce739396190 Install: # Base game files: - ContentPackage: + ContentPackage@base: Name: base Actions: Copy: . ^SupportDir|Content/ra2/ra2.mix: ra2.mix ^SupportDir|Content/ra2/language.mix: language.mix # Game music (optional): - ContentPackage: + ContentPackage@music: Name: music Actions: Copy: . diff --git a/mods/ra2/installer/ra2.yaml b/mods/ra2-content/installer/ra2-disk.yaml similarity index 79% rename from mods/ra2/installer/ra2.yaml rename to mods/ra2-content/installer/ra2-disk.yaml index 10368a34d..c89cceb05 100644 --- a/mods/ra2/installer/ra2.yaml +++ b/mods/ra2-content/installer/ra2-disk.yaml @@ -1,17 +1,17 @@ -ra2: Red Alert 2 (Allied or Soviet Disc, English) +ra2-disk: Red Alert 2 (Allied or Soviet Disc, English) Type: Disc IDFiles: README.txt: e125e2742509d73b20dc4aa65b22497c805cd6f5 Install: # Base game files: - ContentPackage: + ContentPackage@base: Name: base Actions: ExtractMscab: INSTALL/Game1.CAB ^SupportDir|Content/ra2/ra2.mix: ra2.mix ^SupportDir|Content/ra2/language.mix: language.mix # Game music (optional): - ContentPackage: + ContentPackage@music: Name: music Actions: Copy: . diff --git a/mods/ra2-content/mod.yaml b/mods/ra2-content/mod.yaml new file mode 100644 index 000000000..42191045e --- /dev/null +++ b/mods/ra2-content/mod.yaml @@ -0,0 +1,104 @@ +Metadata: + Title: mod-title + Version: {DEV_VERSION} + Hidden: true + +FileSystem: DefaultFileSystem + Packages: + ^EngineDir + ^EngineDir|mods/common-content: content + ^EngineDir|mods/common: common + $ra2-content: ra2content + +Rules: + content|rules.yaml + +Cursors: + content|cursors.yaml + +Chrome: + content|chrome.yaml + +Assemblies: OpenRA.Mods.Common.dll, OpenRA.Mods.Cnc.dll, OpenRA.Mods.RA2.dll + +ChromeLayout: + content|content.yaml + +Notifications: + content|notifications.yaml + +LoadScreen: ModContentLoadScreen + Image: ^EngineDir|mods/common-content/chrome.png + Image2x: ^EngineDir|mods/common-content/chrome-2x.png + Image3x: ^EngineDir|mods/common-content/chrome-3x.png + +ChromeMetrics: + common|metrics.yaml + content|metrics.yaml + +FluentMessages: + common|fluent/common.ftl + content|fluent/content.ftl + content|fluent/chrome.ftl + ra2content|fluent/chrome.ftl + +Fonts: + Regular: + Font: common|FreeSans.ttf + Size: 14 + Ascender: 11 + Bold: + Font: common|FreeSansBold.ttf + Size: 14 + Ascender: 11 + Title: + Font: common|FreeSansBold.ttf + Size: 32 + Ascender: 24 + BigBold: + Font: common|FreeSansBold.ttf + Size: 24 + Ascender: 18 + MediumBold: + Font: common|FreeSansBold.ttf + Size: 18 + Ascender: 14 + Small: + Font: common|FreeSans.ttf + Size: 12 + Ascender: 9 + Tiny: + Font: common|FreeSans.ttf + Size: 10 + Ascender: 8 + TinyBold: + Font: common|FreeSansBold.ttf + Size: 10 + Ascender: 8 + +ModContent: + Mod: ra2 + Packages: + ContentPackage@base: + Title: modcontent-package-basefiles + Identifier: base + TestFiles: ^SupportDir|Content/ra2/ra2.mix, ^SupportDir|Content/ra2/language.mix + Sources: ra2-disk, origin, tfd + Required: true + ContentPackage@music: + Title: modcontent-package-music + Identifier: music + TestFiles: ^SupportDir|Content/ra2/theme.mix + Sources: ra2-disk, origin, tfd + Sources: + ra2content|installer/ra2-disk.yaml + ra2content|installer/origin.yaml + ra2content|installer/firstdecade.yaml + +SoundFormats: + +SpriteFormats: PngSheet + +TerrainFormat: DefaultTerrain + +SpriteSequenceFormat: DefaultSpriteSequence diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index 0735ef39d..e86622bda 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -327,23 +327,3 @@ GameSpeeds: Name: options-game-speed.fastest Timestep: 20 OrderLatency: 6 - -ModContent: - InstallPromptMessage: Red Alert 2 requires artwork and audio from the original game. - HeaderMessage: The original game content must be copied from an original game disc. - Packages: - ContentPackage@base: - Title: Base Game Files - Identifier: base - TestFiles: ^SupportDir|Content/ra2/ra2.mix, ^SupportDir|Content/ra2/language.mix - Sources: ra2, origin, tfd - Required: true - ContentPackage@music: - Title: Game Music - Identifier: music - TestFiles: ^SupportDir|Content/ra2/theme.mix - Sources: ra2, origin, tfd - Sources: - ra2|installer/ra2.yaml - ra2|installer/origin.yaml - ra2|installer/firstdecade.yaml From 4d149dc84d036f197fd635b7dc0b4c40bcb018c7 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 21 Apr 2025 22:16:52 +0300 Subject: [PATCH 14/21] Ran the utility update-mode command .\utility.cmd ra2 --update-mod release-20231010 --detailed --apply --- mods/ra2/chrome/ingame-debug.yaml | 8 +- mods/ra2/chrome/ingame-observer.yaml | 296 +++++++++--------- mods/ra2/chrome/ingame-player.yaml | 31 +- .../mainmenu-prerelease-notification.yaml | 20 +- mods/ra2/maps/defcon-6/map.yaml | 2 +- mods/ra2/maps/roundhouse-kick/map.yaml | 2 +- mods/ra2/maps/tournament-2A/map.yaml | 2 +- mods/ra2/rules/aircraft.yaml | 2 +- mods/ra2/rules/allied-naval.yaml | 10 +- mods/ra2/rules/allied-structures.yaml | 6 +- mods/ra2/rules/allied-vehicles.yaml | 17 +- mods/ra2/rules/civilian-props.yaml | 6 +- mods/ra2/rules/defaults.yaml | 6 +- mods/ra2/rules/palettes.yaml | 4 +- mods/ra2/rules/soviet-infantry.yaml | 6 +- mods/ra2/rules/soviet-naval.yaml | 10 +- mods/ra2/rules/soviet-structures.yaml | 9 +- mods/ra2/rules/soviet-vehicles.yaml | 13 +- mods/ra2/rules/tech-structures.yaml | 2 +- mods/ra2/weapons/explosions.yaml | 2 +- 20 files changed, 235 insertions(+), 219 deletions(-) diff --git a/mods/ra2/chrome/ingame-debug.yaml b/mods/ra2/chrome/ingame-debug.yaml index 013e81d35..060e97da0 100644 --- a/mods/ra2/chrome/ingame-debug.yaml +++ b/mods/ra2/chrome/ingame-debug.yaml @@ -1,15 +1,15 @@ Container@DEBUG_PANEL: Logic: DebugMenuLogic Y: 10 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Children: Label@TITLE: Y: 26 Font: Bold Text: Debug Options Align: Center - Width: PARENT_RIGHT + Width: PARENT_WIDTH Checkbox@INSTANT_BUILD: X: 45 Y: 45 @@ -85,7 +85,7 @@ Container@DEBUG_PANEL: Font: Bold Text: Visualizations Align: Center - Width: PARENT_RIGHT + Width: PARENT_WIDTH Checkbox@SHOW_UNIT_PATHS: X: 45 Y: 275 diff --git a/mods/ra2/chrome/ingame-observer.yaml b/mods/ra2/chrome/ingame-observer.yaml index b0b581cc0..feb3e2498 100644 --- a/mods/ra2/chrome/ingame-observer.yaml +++ b/mods/ra2/chrome/ingame-observer.yaml @@ -14,12 +14,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 @@ -28,13 +28,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 @@ -42,17 +42,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 @@ -75,12 +75,12 @@ Container@OBSERVER_WIDGETS: Y: 2 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: @@ -187,33 +187,33 @@ Container@OBSERVER_WIDGETS: Container@GRAPH_BG: Y: 30 X: 0 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 25 Children: Container@BASIC_STATS_HEADERS: X: 0 Y: 0 Width: 700 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left @@ -222,7 +222,7 @@ Container@OBSERVER_WIDGETS: X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Cash Align: Right @@ -231,7 +231,7 @@ Container@OBSERVER_WIDGETS: X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Power Align: Center @@ -240,7 +240,7 @@ Container@OBSERVER_WIDGETS: X: 315 Y: 0 Width: 40 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Kills Align: Right @@ -249,7 +249,7 @@ Container@OBSERVER_WIDGETS: X: 355 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Deaths Align: Right @@ -258,7 +258,7 @@ Container@OBSERVER_WIDGETS: X: 415 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Destroyed Align: Right @@ -267,7 +267,7 @@ Container@OBSERVER_WIDGETS: X: 495 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Lost Align: Right @@ -276,7 +276,7 @@ Container@OBSERVER_WIDGETS: X: 575 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Score Align: Right @@ -285,7 +285,7 @@ Container@OBSERVER_WIDGETS: X: 635 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: APM Align: Right @@ -294,32 +294,32 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Width: 640 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 35 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Shadow: True Label@CASH_HEADER: X: 155 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Cash Align: Right @@ -327,7 +327,7 @@ Container@OBSERVER_WIDGETS: Label@INCOME_HEADER: X: 235 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Income Align: Right @@ -335,7 +335,7 @@ Container@OBSERVER_WIDGETS: Label@ASSETS_HEADER: X: 315 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Assets Align: Right @@ -343,7 +343,7 @@ Container@OBSERVER_WIDGETS: Label@EARNED_HEADER: X: 395 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Earned Align: Right @@ -351,7 +351,7 @@ Container@OBSERVER_WIDGETS: Label@SPENT_HEADER: X: 475 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Spent Align: Right @@ -359,7 +359,7 @@ Container@OBSERVER_WIDGETS: Label@HARVESTERS_HEADER: X: 555 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Harvesters Align: Right @@ -368,26 +368,26 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Width: 400 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left @@ -396,7 +396,7 @@ Container@OBSERVER_WIDGETS: X: 155 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Production Shadow: True @@ -404,26 +404,26 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Width: 400 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left @@ -432,7 +432,7 @@ Container@OBSERVER_WIDGETS: X: 155 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Support Powers Shadow: True @@ -440,26 +440,26 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Width: 400 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 40 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left @@ -468,7 +468,7 @@ Container@OBSERVER_WIDGETS: X: 160 Y: 0 Width: 100 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Army Shadow: True @@ -476,26 +476,26 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Width: 760 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Children: ColorBlock@HEADER_COLOR: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@HEADER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@PLAYER_HEADER: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Player Align: Left @@ -504,7 +504,7 @@ Container@OBSERVER_WIDGETS: X: 155 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Destroyed Align: Right @@ -513,7 +513,7 @@ Container@OBSERVER_WIDGETS: X: 230 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Lost Align: Right @@ -522,7 +522,7 @@ Container@OBSERVER_WIDGETS: X: 310 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: U. Killed Align: Right @@ -531,7 +531,7 @@ Container@OBSERVER_WIDGETS: X: 385 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: U. Lost Align: Right @@ -540,7 +540,7 @@ Container@OBSERVER_WIDGETS: X: 460 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: B. Killed Align: Right @@ -549,7 +549,7 @@ Container@OBSERVER_WIDGETS: X: 535 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: B. Lost Align: Right @@ -558,7 +558,7 @@ Container@OBSERVER_WIDGETS: X: 610 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Army Value Align: Right @@ -567,7 +567,7 @@ Container@OBSERVER_WIDGETS: X: 700 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Text: Vision Align: Right @@ -575,7 +575,7 @@ Container@OBSERVER_WIDGETS: ScrollPanel@PLAYER_STATS_PANEL: X: 0 Y: 55 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 250 TopBottomSpacing: 0 BorderWidth: 0 @@ -593,20 +593,20 @@ Container@OBSERVER_WIDGETS: X: 0 Y: 0 Color: 00000090 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@TEAM_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 TopLeftColor: 00000090 BottomLeftColor: 00000090 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Label@TEAM: X: 10 Y: 0 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Font: Bold Shadow: True ScrollItem@BASIC_PLAYER_TEMPLATE: @@ -619,13 +619,13 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 2 Y: 2 @@ -635,63 +635,63 @@ Container@OBSERVER_WIDGETS: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@CASH: X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@POWER: X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Center Shadow: True Label@KILLS: X: 315 Y: 0 Width: 40 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@DEATHS: X: 355 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_DESTROYED: X: 415 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_LOST: X: 495 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@EXPERIENCE: X: 575 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ACTIONS_MIN: X: 635 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True ScrollItem@ECONOMY_PLAYER_TEMPLATE: @@ -704,13 +704,13 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 2 Y: 2 @@ -720,49 +720,49 @@ Container@OBSERVER_WIDGETS: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@CASH: X: 155 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@INCOME: X: 235 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS: X: 315 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@EARNED: X: 395 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@SPENT: X: 475 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@HARVESTERS: X: 555 Y: 0 Width: 80 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True ScrollItem@PRODUCTION_PLAYER_TEMPLATE: @@ -775,13 +775,13 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 2 Y: 2 @@ -791,14 +791,14 @@ Container@OBSERVER_WIDGETS: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True ObserverProductionIcons@PRODUCTION_ICONS: X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER ScrollItem@SUPPORT_POWERS_PLAYER_TEMPLATE: X: 0 @@ -810,13 +810,13 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 2 Y: 2 @@ -826,14 +826,14 @@ Container@OBSERVER_WIDGETS: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True ObserverSupportPowerIcons@SUPPORT_POWER_ICONS: X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER ScrollItem@ARMY_PLAYER_TEMPLATE: X: 0 @@ -845,32 +845,32 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 5 Y: 4 Width: 35 - Height: PARENT_BOTTOM - 4 + Height: PARENT_HEIGHT - 4 ImageName: random ImageCollection: flags Label@PLAYER: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True ObserverArmyIcons@ARMY_ICONS: X: 155 Y: 0 Width: 0 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT TooltipContainer: TOOLTIP_CONTAINER ScrollItem@COMBAT_PLAYER_TEMPLATE: X: 0 @@ -882,13 +882,13 @@ Container@OBSERVER_WIDGETS: ColorBlock@PLAYER_COLOR: X: 0 Y: 0 - Width: PARENT_RIGHT - 200 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 200 + Height: PARENT_HEIGHT GradientColorBlock@PLAYER_GRADIENT: - X: PARENT_RIGHT - 200 + X: PARENT_WIDTH - 200 Y: 0 Width: 200 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Image@FLAG: X: 2 Y: 2 @@ -898,83 +898,83 @@ Container@OBSERVER_WIDGETS: X: 35 Y: 0 Width: 120 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Font: Bold Shadow: True Label@ASSETS_DESTROYED: X: 155 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ASSETS_LOST: X: 230 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@UNITS_KILLED: X: 310 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@UNITS_DEAD: X: 385 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@BUILDINGS_KILLED: X: 460 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@BUILDINGS_DEAD: X: 535 Y: 0 Width: 75 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@ARMY_VALUE: X: 610 Y: 0 Width: 90 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Label@VISION: X: 700 Y: 0 Width: 60 - Height: PARENT_BOTTOM + Height: PARENT_HEIGHT Align: Right Shadow: True Container@INCOME_GRAPH_CONTAINER: X: 0 Y: 30 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Visible: False Children: ColorBlock@GRAPH_BACKGROUND: X: 0 Y: 0 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Color: 00000090 LineGraph@INCOME_GRAPH: X: 0 Y: 0 - Width: PARENT_RIGHT - 5 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 5 + Height: PARENT_HEIGHT ValueFormat: ${0} YAxisValueFormat: ${0:F0} XAxisSize: 40 @@ -986,21 +986,21 @@ Container@OBSERVER_WIDGETS: Container@ARMY_VALUE_GRAPH_CONTAINER: X: 0 Y: 30 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Visible: False Children: ColorBlock@GRAPH_BACKGROUND: X: 0 Y: 0 - Width: PARENT_RIGHT - Height: PARENT_BOTTOM + Width: PARENT_WIDTH + Height: PARENT_HEIGHT Color: 00000090 LineGraph@ARMY_VALUE_GRAPH: X: 0 Y: 0 - Width: PARENT_RIGHT - 5 - Height: PARENT_BOTTOM + Width: PARENT_WIDTH - 5 + Height: PARENT_HEIGHT ValueFormat: ${0} YAxisValueFormat: ${0:F0} XAxisSize: 40 diff --git a/mods/ra2/chrome/ingame-player.yaml b/mods/ra2/chrome/ingame-player.yaml index b6b41aef0..302d07251 100644 --- a/mods/ra2/chrome/ingame-player.yaml +++ b/mods/ra2/chrome/ingame-player.yaml @@ -43,7 +43,7 @@ Container@PLAYER_WIDGETS: Image@COMMAND_BAR_BACKGROUND: Logic: AddFactionSuffixLogic X: 5 - Y: WINDOW_BOTTOM - HEIGHT - 5 + Y: WINDOW_HEIGHT - HEIGHT - 5 Width: 459 Height: 31 ImageCollection: sidebar @@ -53,7 +53,7 @@ Container@PLAYER_WIDGETS: Logic: CommandBarLogic HighlightOnButtonPress: True X: 36 - Y: WINDOW_BOTTOM - HEIGHT - 10 + Y: WINDOW_HEIGHT - HEIGHT - 10 Width: 270 Height: 26 Children: @@ -208,7 +208,7 @@ Container@PLAYER_WIDGETS: Container@STANCE_BAR: Logic: StanceSelectorLogic X: 324 - Y: WINDOW_BOTTOM - HEIGHT - 10 + Y: WINDOW_HEIGHT - HEIGHT - 10 Width: 101 Height: 21 Children: @@ -289,7 +289,7 @@ Container@PLAYER_WIDGETS: ImageName: hold-fire Image@SIDEBAR_BACKGROUND_TOP: Logic: AddFactionSuffixLogic - X: WINDOW_RIGHT - 234 + X: WINDOW_WIDTH - 234 Y: 0 Width: 234 Height: 275 @@ -406,7 +406,7 @@ Container@PLAYER_WIDGETS: Logic: GameTimerLogic X: 0 Y: 0 - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 23 Align: Center Font: TinyBold @@ -429,7 +429,7 @@ Container@PLAYER_WIDGETS: ImageName: cash-normal LabelWithTooltip@POWER: Logic: IngamePowerCounterLogic - X: PARENT_RIGHT - WIDTH - 34 + X: PARENT_WIDTH - WIDTH - 34 Y: 0 Width: 50 Height: 23 @@ -441,13 +441,13 @@ Container@PLAYER_WIDGETS: Children: Image@POWER_ICON: Logic: AddFactionSuffixLogic - X: PARENT_RIGHT + 3 + X: PARENT_WIDTH + 3 Y: 3 ImageCollection: power-icons ImageName: power-normal Container@SIDEBAR_PRODUCTION: Logic: ClassicProductionLogic - X: WINDOW_RIGHT - 234 + X: WINDOW_WIDTH - 234 Y: 275 Width: 234 Height: 250 @@ -469,7 +469,7 @@ Container@PLAYER_WIDGETS: ImageCollection: sidebar ImageName: background-bottom PowerMeter: - X: WINDOW_RIGHT - 230 + X: WINDOW_WIDTH - 230 Y: 270 MeterAlongside: ROW_TEMPLATE ParentContainer: PALETTE_BACKGROUND @@ -606,7 +606,7 @@ Container@PLAYER_WIDGETS: Button@SCROLL_UP_BUTTON: Logic: AddFactionSuffixLogic X: 89 - Y: PARENT_BOTTOM + 305 + Y: PARENT_HEIGHT + 305 Width: 77 Height: 27 VisualHeight: 0 @@ -616,7 +616,7 @@ Container@PLAYER_WIDGETS: Button@SCROLL_DOWN_BUTTON: Logic: AddFactionSuffixLogic X: 12 - Y: PARENT_BOTTOM + 305 + Y: PARENT_HEIGHT + 305 Width: 77 Height: 27 VisualHeight: 0 @@ -625,20 +625,19 @@ Container@PLAYER_WIDGETS: TooltipContainer: TOOLTIP_CONTAINER Container@HPF_OVERLAY: Logic: HierarchicalPathFinderOverlayLogic - X: WINDOW_RIGHT - WIDTH - 260 + X: WINDOW_WIDTH - WIDTH - 260 Y: 40 Width: 175 Height: 60 Children: DropDownButton@HPF_OVERLAY_LOCOMOTOR: - Y: PARENT_TOP - Width: PARENT_RIGHT + Width: PARENT_WIDTH Height: 25 Text: Select Locomotor Font: Regular DropDownButton@HPF_OVERLAY_CHECK: - Y: PARENT_TOP + 35 - Width: PARENT_RIGHT + Y: 0 + 35 + Width: PARENT_WIDTH Height: 25 Text: Select BlockedByActor Font: Regular diff --git a/mods/ra2/chrome/mainmenu-prerelease-notification.yaml b/mods/ra2/chrome/mainmenu-prerelease-notification.yaml index e6497a554..6bf574986 100644 --- a/mods/ra2/chrome/mainmenu-prerelease-notification.yaml +++ b/mods/ra2/chrome/mainmenu-prerelease-notification.yaml @@ -1,12 +1,12 @@ Background@MAINMENU_PRERELEASE_NOTIFICATION: Logic: PreReleaseWarningPrompt - X: (WINDOW_RIGHT - WIDTH) / 2 - Y: (WINDOW_BOTTOM - HEIGHT) / 2 + X: (WINDOW_WIDTH - WIDTH) / 2 + Y: (WINDOW_HEIGHT - HEIGHT) / 2 Width: 520 Height: 195 Children: Label@PROMPT_TITLE: - Width: PARENT_RIGHT + Width: PARENT_WIDTH Y: 20 Height: 25 Font: Bold @@ -15,40 +15,40 @@ Background@MAINMENU_PRERELEASE_NOTIFICATION: Label@PROMPT_TEXT_A: X: 15 Y: 50 - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 16 Align: Center Text: This pre-alpha build of OpenRA's Red Alert 2 mod is made available Label@PROMPT_TEXT_B: X: 15 Y: 68 - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 16 Align: Center Text: for the community to follow development and as example for modders. Label@PROMPT_TEXT_C: X: 15 Y: 104 - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 16 Align: Center Text: Many features are missing or incomplete, performance has not been Label@PROMPT_TEXT_D: X: 15 Y: 122 - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 16 Align: Center Text: optimized, and balance will not be addressed until a future beta. Label@PROMPT_TEXT_E: X: 15 Y: 140 - Width: PARENT_RIGHT - 30 + Width: PARENT_WIDTH - 30 Height: 16 Align: Center Button@CONTINUE_BUTTON: - X: PARENT_RIGHT - WIDTH - 20 - Y: PARENT_BOTTOM - 45 + X: PARENT_WIDTH - WIDTH - 20 + Y: PARENT_HEIGHT - 45 Width: 120 Height: 25 Text: I Understand diff --git a/mods/ra2/maps/defcon-6/map.yaml b/mods/ra2/maps/defcon-6/map.yaml index d379e6bf0..be7643918 100644 --- a/mods/ra2/maps/defcon-6/map.yaml +++ b/mods/ra2/maps/defcon-6/map.yaml @@ -1748,7 +1748,7 @@ Actors: Rules: World: - GlobalLightingPaletteEffect: + TintPostProcessEffect: Ambient: 0.85 Green: 0.92 Blue: 0.75 diff --git a/mods/ra2/maps/roundhouse-kick/map.yaml b/mods/ra2/maps/roundhouse-kick/map.yaml index 5429679c6..1afbd02c5 100644 --- a/mods/ra2/maps/roundhouse-kick/map.yaml +++ b/mods/ra2/maps/roundhouse-kick/map.yaml @@ -868,6 +868,6 @@ Actors: Rules: World: - GlobalLightingPaletteEffect: + TintPostProcessEffect: Ambient: 0.68 Green: 0.75 diff --git a/mods/ra2/maps/tournament-2A/map.yaml b/mods/ra2/maps/tournament-2A/map.yaml index cc05534a0..af216b65e 100644 --- a/mods/ra2/maps/tournament-2A/map.yaml +++ b/mods/ra2/maps/tournament-2A/map.yaml @@ -964,5 +964,5 @@ Actors: Rules: World: - GlobalLightingPaletteEffect: + TintPostProcessEffect: Ambient: 0.68 diff --git a/mods/ra2/rules/aircraft.yaml b/mods/ra2/rules/aircraft.yaml index 941aa155d..6266861ac 100644 --- a/mods/ra2/rules/aircraft.yaml +++ b/mods/ra2/rules/aircraft.yaml @@ -130,7 +130,7 @@ zep: WithVoxelBody: Hovers: BobDistance: -10 - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode Chance: 75 VoiceAnnouncement: diff --git a/mods/ra2/rules/allied-naval.yaml b/mods/ra2/rules/allied-naval.yaml index c61e8fc53..d8dac5d05 100644 --- a/mods/ra2/rules/allied-naval.yaml +++ b/mods/ra2/rules/allied-naval.yaml @@ -32,7 +32,7 @@ lcrf: UnloadTerrainTypes: Clear, Rough, Rail, Road, DirtRoad, Beach, Ore, Gems UnloadVoice: Move LoadingCondition: notmobile - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody: @@ -115,7 +115,7 @@ dest: DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody@FULL: @@ -160,7 +160,7 @@ aegis: Voice: Attack FacingTolerance: 512 AutoTarget: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody: @@ -217,6 +217,8 @@ dlph: CloakedCondition: underwater UncloakOn: Damage IsPlayerPalette: true + CloakedPalette: cloak + CloakStyle: Palette Targetable: TargetTypes: Ground, Water, ImmuneToAllySonic, Submergeable RequiresCondition: !underwater @@ -285,7 +287,7 @@ carrier: AttackFrontal: Voice: Attack FacingTolerance: 512 - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody: diff --git a/mods/ra2/rules/allied-structures.yaml b/mods/ra2/rules/allied-structures.yaml index b06c0144b..5ebcab9b9 100644 --- a/mods/ra2/rules/allied-structures.yaml +++ b/mods/ra2/rules/allied-structures.yaml @@ -232,12 +232,10 @@ garefn: RevealsShroud: Range: 6c0 Refinery: - DockOffset: 3,1 ShowTicks: True TickLifetime: 30 TickVelocity: 1 TickRate: 10 - DockAngle: 640 UseStorage: false CustomSellValue: Value: 300 @@ -265,6 +263,10 @@ garefn: SpawnSurvivors: DeathTypes: ExplosionDeath, BulletDeath Actors: e1, e1 + DockHost: + Type: Unload + DockAngle: 640 + DockOffset: 1086,1086,0 gaairc: Inherits: ^BaseBuilding diff --git a/mods/ra2/rules/allied-vehicles.yaml b/mods/ra2/rules/allied-vehicles.yaml index 9c0f21ff3..ed4967b0a 100644 --- a/mods/ra2/rules/allied-vehicles.yaml +++ b/mods/ra2/rules/allied-vehicles.yaml @@ -57,13 +57,11 @@ cmin: Priority: 7 Bounds: 1544, 2509, 0, -289 Harvester: - Capacity: 20 Resources: Ore, Gems BaleUnloadDelay: 1 SearchFromProcRadius: 24 SearchFromHarvesterRadius: 12 HarvestVoice: Move - DeliverVoice: Move ChronoResourceDelivery: WarpInSequence: warpout WarpInSound: vchrtele.wav @@ -91,7 +89,7 @@ cmin: Voiced: VoiceSet: ChronoMinerVoice HitShape: - WithHarvesterPipsDecoration: + WithStoresResourcesPipsDecoration: Position: BottomLeft RequiresSelection: true PipCount: 7 @@ -99,6 +97,11 @@ cmin: ResourceSequences: Ore: pip-yellow Gems: pip-red + StoresResources: + Capacity: 20 + Resources: Ore, Gems + DockClientManager: + Voice: Move mtnk: Inherits: ^Vehicle @@ -324,9 +327,9 @@ fv: RenderSprites: RenderVoxels: WithVoxelBody: - Explodes: + FireWarheadsOnDeath: RequiresCondition: !ifv-demo - Explodes@demo: + FireWarheadsOnDeath@demo: Weapon: CRNuke EmptyWeapon: CRNuke RequiresCondition: ifv-demo @@ -398,7 +401,7 @@ sref: AttackTurreted: Voice: Attack AutoTarget: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall RenderSprites: @@ -484,7 +487,7 @@ mgtk: WithMuzzleOverlay: AutoTarget: AllowMovement: false - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall RenderSprites: diff --git a/mods/ra2/rules/civilian-props.yaml b/mods/ra2/rules/civilian-props.yaml index bcb024dc8..2c1c9d115 100644 --- a/mods/ra2/rules/civilian-props.yaml +++ b/mods/ra2/rules/civilian-props.yaml @@ -10,7 +10,7 @@ camisc01: DamagedSounds: bmetdama.wav, bmetdamb.wav, bmetdamc.wav MapEditorData: Categories: Decoration - Explodes: + FireWarheadsOnDeath: Weapon: LargeBarrelExplode camisc02: @@ -25,7 +25,7 @@ camisc02: DamagedSounds: bmetdama.wav, bmetdamb.wav, bmetdamc.wav MapEditorData: Categories: Decoration - Explodes: + FireWarheadsOnDeath: Weapon: SmallBarrelExplode camisc03: @@ -86,7 +86,7 @@ camisc06: HP: 10 Armor: Type: Concrete - Explodes: + FireWarheadsOnDeath: Type: Footprint Weapon: V3AmmunitionExplode SoundOnDamageTransition: diff --git a/mods/ra2/rules/defaults.yaml b/mods/ra2/rules/defaults.yaml index 990f8dcdc..7814962c9 100644 --- a/mods/ra2/rules/defaults.yaml +++ b/mods/ra2/rules/defaults.yaml @@ -355,7 +355,7 @@ DamagedSounds: gdamag1a.wav, gdamag1b.wav, gdamag1c.wav, gdamag1d.wav, gdamag1e.wav DestroyedSounds: bgendiea.wav, bgendieb.wav, bgendiec.wav, bgendied.wav, bgendiee.wav, bgendief.wav WithSpriteBody: - Explodes: + FireWarheadsOnDeath: Type: Footprint Weapon: BuildingExplode RepairableBuilding: @@ -868,7 +868,7 @@ QuantizedFacings: 0 CameraPitch: 85 UseClassicPerspectiveFudge: false - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall RenderVoxels: @@ -1082,7 +1082,7 @@ UseClassicPerspectiveFudge: false Tooltip: GenericName: Ship - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall RenderVoxels: diff --git a/mods/ra2/rules/palettes.yaml b/mods/ra2/rules/palettes.yaml index d6c41be25..f80485f73 100644 --- a/mods/ra2/rules/palettes.yaml +++ b/mods/ra2/rules/palettes.yaml @@ -163,12 +163,12 @@ VoxelNormalsPalette@ts-normals: Name: ts-normals Type: TiberianSun - MenuPaletteEffect: + MenuPostProcessEffect: PaletteFromPaletteWithAlpha@effect75alpha: Name: effect75alpha BasePalette: ra Alpha: 0.75 - FlashPaletteEffect@NUKE: + FlashPostProcessEffect@NUKE: Type: Nuke Length: 90 WeatherPaletteEffect@LIGHTNINGSTORM: diff --git a/mods/ra2/rules/soviet-infantry.yaml b/mods/ra2/rules/soviet-infantry.yaml index 1538f81f0..197edeaa7 100644 --- a/mods/ra2/rules/soviet-infantry.yaml +++ b/mods/ra2/rules/soviet-infantry.yaml @@ -201,7 +201,7 @@ terror: Type: Flak Passenger: CustomPipType: red - Explodes: + FireWarheadsOnDeath: Weapon: TerrorBomb EmptyWeapon: TerrorBomb AttackFrontal: @@ -328,7 +328,7 @@ ivan: Type: None Passenger: CustomPipType: red - Explodes: + FireWarheadsOnDeath: Weapon: IvanDeath EmptyWeapon: IvanDeath Armament@primary: @@ -374,7 +374,7 @@ civan: Voice: Move ChargeDelay: 300 TargetCursor: chronosphere - -Explodes: + -FireWarheadsOnDeath: yuri: Inherits: ^Infantry diff --git a/mods/ra2/rules/soviet-naval.yaml b/mods/ra2/rules/soviet-naval.yaml index cb8a2805b..dec9b54e7 100644 --- a/mods/ra2/rules/soviet-naval.yaml +++ b/mods/ra2/rules/soviet-naval.yaml @@ -32,7 +32,7 @@ sapc: UnloadTerrainTypes: Clear, Rough, Rail, Road, DirtRoad, Beach, Ore, Gems UnloadVoice: Move LoadingCondition: notmobile - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody: @@ -88,6 +88,8 @@ sub: CloakedCondition: underwater UncloakOn: Damage IsPlayerPalette: true + CloakedPalette: cloak + CloakStyle: Palette Armament: Weapon: SubTorpedo LocalOffset: 768,0,0 @@ -107,7 +109,7 @@ sub: DetectionTypes: Underwater Range: 4c0 RenderDetectionCircle: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode -MustBeDestroyed: @@ -156,7 +158,7 @@ hyd: LocalOffset: 256,0,1408 MuzzleSequence: muzzle WithMuzzleOverlay: - Explodes: + FireWarheadsOnDeath: Weapon: UnitExplode EmptyWeapon: UnitExplode WithVoxelBody: @@ -214,6 +216,8 @@ sqd: CloakedCondition: underwater UncloakOn: Damage, Attack IsPlayerPalette: true + CloakedPalette: cloak + CloakStyle: Palette Targetable: TargetTypes: Ground, Water, Submergeable RequiresCondition: !underwater diff --git a/mods/ra2/rules/soviet-structures.yaml b/mods/ra2/rules/soviet-structures.yaml index 4526aec11..fdd8583aa 100644 --- a/mods/ra2/rules/soviet-structures.yaml +++ b/mods/ra2/rules/soviet-structures.yaml @@ -247,12 +247,10 @@ narefn: RevealsShroud: Range: 6c0 Refinery: - DockOffset: 3, 1 ShowTicks: True TickLifetime: 30 TickVelocity: 1 TickRate: 10 - DockAngle: 640 UseStorage: false CustomSellValue: Value: 300 @@ -280,6 +278,10 @@ narefn: SpawnSurvivors: DeathTypes: ExplosionDeath, BulletDeath Actors: e2, e2, e2 + DockHost: + Type: Unload + DockAngle: 640 + DockOffset: 1086,1086,0 naradr: Inherits: ^BaseBuilding @@ -637,7 +639,7 @@ nanrct: WithIdleOverlay@lights: Sequence: idle-lights RequiresCondition: !build-incomplete - Explodes: + FireWarheadsOnDeath: Type: CenterPosition Weapon: NukePayload EmptyWeapon: NukePayload @@ -857,6 +859,7 @@ nairon: PauseOnCondition: lowpower Dimensions: 3, 3 Footprint: xxx xxx xxx + BlockedCursor: move-blocked SupportPowerChargeBar: InfiltrateForSupportPowerReset: Types: SpyInfiltrate diff --git a/mods/ra2/rules/soviet-vehicles.yaml b/mods/ra2/rules/soviet-vehicles.yaml index 1ea68db06..b4d3fc3ba 100644 --- a/mods/ra2/rules/soviet-vehicles.yaml +++ b/mods/ra2/rules/soviet-vehicles.yaml @@ -60,13 +60,11 @@ harv: Priority: 7 Bounds: 1544, 2509, 0, -289 Harvester: - Capacity: 40 Resources: Ore, Gems BaleUnloadDelay: 1 SearchFromProcRadius: 24 SearchFromHarvesterRadius: 12 HarvestVoice: Move - DeliverVoice: Move Health: HP: 1000 Armor: @@ -106,7 +104,7 @@ harv: Voiced: VoiceSet: SovietVehicleVoice HitShape: - WithHarvesterPipsDecoration: + WithStoresResourcesPipsDecoration: Position: BottomLeft RequiresSelection: true PipCount: 7 @@ -114,6 +112,11 @@ harv: ResourceSequences: Ore: pip-yellow Gems: pip-red + StoresResources: + Capacity: 40 + Resources: Ore, Gems + DockClientManager: + Voice: Move dron: Inherits: ^Vehicle @@ -337,7 +340,7 @@ apoc: WithVoxelBody: WithVoxelTurret: WithVoxelBarrel: - Explodes: + FireWarheadsOnDeath: Weapon: ApocExplode EmptyWeapon: ApocExplode Voiced: @@ -421,7 +424,7 @@ dtruck: Locomotor: heavytracked RevealsShroud: Range: 4c0 - Explodes: + FireWarheadsOnDeath: Weapon: demobomb EmptyWeapon: demobomb AttackFrontal: diff --git a/mods/ra2/rules/tech-structures.yaml b/mods/ra2/rules/tech-structures.yaml index ab4fe21d7..79d85121c 100644 --- a/mods/ra2/rules/tech-structures.yaml +++ b/mods/ra2/rules/tech-structures.yaml @@ -25,7 +25,7 @@ caoild: Offset: 1000,0,0 GivesCashOnCapture: Amount: 1000 - Explodes: + FireWarheadsOnDeath: Weapon: DerrickExplode SpawnActorOnDeath: Actor: caoild.rubble diff --git a/mods/ra2/weapons/explosions.yaml b/mods/ra2/weapons/explosions.yaml index aee66a336..b4af8460b 100644 --- a/mods/ra2/weapons/explosions.yaml +++ b/mods/ra2/weapons/explosions.yaml @@ -232,7 +232,7 @@ atomic: Duration: 20 Intensity: 5 Multiplier: 1,1 - Warhead@7FlashEffect: FlashPaletteEffect + Warhead@7FlashEffect: FlashEffect Duration: 20 FlashType: Nuke From 707d083d863cf1cd25f8a136f908dc3b0941476f Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 22 Apr 2025 22:37:20 +0300 Subject: [PATCH 15/21] 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/ra2/chrome/ingame-debug.yaml | 40 ++-- mods/ra2/chrome/ingame-observer.yaml | 84 ++++---- mods/ra2/chrome/ingame-player.yaml | 90 ++++---- .../mainmenu-prerelease-notification.yaml | 12 +- mods/ra2/fluent/chrome.ftl | 202 ++++++++++++++++++ mods/ra2/mod.yaml | 1 + 6 files changed, 316 insertions(+), 113 deletions(-) create mode 100644 mods/ra2/fluent/chrome.ftl diff --git a/mods/ra2/chrome/ingame-debug.yaml b/mods/ra2/chrome/ingame-debug.yaml index 060e97da0..c8f868afa 100644 --- a/mods/ra2/chrome/ingame-debug.yaml +++ b/mods/ra2/chrome/ingame-debug.yaml @@ -7,7 +7,7 @@ Container@DEBUG_PANEL: Label@TITLE: Y: 26 Font: Bold - Text: Debug Options + Text: label-debug-panel-title Align: Center Width: PARENT_WIDTH Checkbox@INSTANT_BUILD: @@ -16,74 +16,74 @@ Container@DEBUG_PANEL: Width: 200 Height: 20 Font: Regular - Text: Instant Build Speed + Text: checkbox-debug-panel-instant-build Checkbox@ENABLE_TECH: X: 45 Y: 75 Width: 200 Height: 20 Font: Regular - Text: Build Everything + Text: checkbox-debug-panel-enable-tech Checkbox@BUILD_ANYWHERE: X: 45 Y: 105 Width: 200 Height: 20 Font: Regular - Text: Build Anywhere + Text: checkbox-debug-panel-build-anywhere Checkbox@UNLIMITED_POWER: X: 290 Y: 45 Width: 200 Height: 20 Font: Regular - Text: Unlimited Power + Text: checkbox-debug-panel-unlimited-power Checkbox@INSTANT_CHARGE: X: 290 Y: 75 Width: 200 Height: 20 Font: Regular - Text: Instant Charge Time + Text: checkbox-debug-panel-instant-charge Checkbox@DISABLE_VISIBILITY_CHECKS: X: 290 Y: 105 Height: 20 Width: 200 Font: Regular - Text: Disable Visibility Checks + Text: checkbox-debug-panel-disable-visibility-checks Button@GIVE_CASH: X: 90 Y: 150 Width: 140 Height: 30 Font: Bold - Text: Give $20,000 + Text: button-debug-panel-give-cash Button@GROW_RESOURCES: X: 271 Y: 150 Width: 140 Height: 30 Font: Bold - Text: Grow Resources + Text: button-debug-panel-grow-resources Button@GIVE_EXPLORATION: X: 90 Y: 200 Width: 140 Height: 30 Font: Bold - Text: Clear Shroud + Text: button-debug-panel-give-exploration Button@RESET_EXPLORATION: X: 271 Y: 200 Width: 140 Height: 30 Font: Bold - Text: Reset Shroud + Text: button-debug-panel-reset-exploration Label@VISUALIZATIONS_TITLE: Y: 255 Font: Bold - Text: Visualizations + Text: label-debug-panel-visualizations-title Align: Center Width: PARENT_WIDTH Checkbox@SHOW_UNIT_PATHS: @@ -92,53 +92,53 @@ Container@DEBUG_PANEL: Width: 200 Height: 20 Font: Regular - Text: Show Unit Paths + Text: checkbox-debug-panel-show-unit-paths Checkbox@SHOW_CUSTOMTERRAIN_OVERLAY: X: 45 Y: 305 Height: 20 Width: 200 Font: Regular - Text: Show Custom Terrain + Text: checkbox-debug-panel-show-customterrain-overlay Checkbox@SHOW_ACTOR_TAGS: X: 45 Y: 335 Height: 20 Width: 200 Font: Regular - Text: Show Actor Tags + Text: checkbox-debug-panel-show-actor-tags Checkbox@SHOW_DEPTH_PREVIEW: X: 45 Y: 365 Height: 20 Width: 200 Font: Regular - Text: Show Depth Data + Text: checkbox-debug-panel-show-depth-preview Checkbox@SHOW_COMBATOVERLAY: X: 290 Y: 275 Height: 20 Width: 200 Font: Regular - Text: Show Combat Geometry + Text: checkbox-debug-panel-show-combatoverlay Checkbox@SHOW_GEOMETRY: X: 290 Y: 305 Height: 20 Width: 200 Font: Regular - Text: Show Render Geometry + Text: checkbox-debug-panel-show-geometry Checkbox@SHOW_TERRAIN_OVERLAY: X: 290 Y: 335 Height: 20 Width: 200 Font: Regular - Text: Show Terrain Geometry + Text: checkbox-debug-panel-show-terrain-overlay Checkbox@SHOW_SCREENMAP: X: 290 Y: 365 Height: 20 Width: 200 Font: Regular - Text: Show Screen Map + Text: checkbox-debug-panel-show-screenmap diff --git a/mods/ra2/chrome/ingame-observer.yaml b/mods/ra2/chrome/ingame-observer.yaml index feb3e2498..fa30c4143 100644 --- a/mods/ra2/chrome/ingame-observer.yaml +++ b/mods/ra2/chrome/ingame-observer.yaml @@ -8,7 +8,7 @@ Container@OBSERVER_WIDGETS: Y: 5 Width: 160 Height: 25 - Text: Options (Esc) + Text: button-observer-widgets-options Font: Bold Key: escape DisableWorldSounds: true @@ -96,7 +96,7 @@ Container@OBSERVER_WIDGETS: Width: 26 Height: 26 Key: Pause - TooltipText: Pause + TooltipText: button-replay-player-pause-tooltip TooltipContainer: TOOLTIP_CONTAINER IgnoreChildMouseOver: true Children: @@ -112,7 +112,7 @@ Container@OBSERVER_WIDGETS: Height: 26 Key: Pause IgnoreChildMouseOver: true - TooltipText: Play + TooltipText: button-replay-player-play-tooltip TooltipContainer: TOOLTIP_CONTAINER Children: Image@IMAGE_PLAY: @@ -126,9 +126,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 @@ -136,9 +136,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 @@ -146,9 +146,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 @@ -156,9 +156,9 @@ 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 Container@INGAME_OBSERVERSTATS_BG: Logic: ObserverStatsLogic @@ -215,7 +215,7 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-basic-stats-player-header Align: Left Shadow: True Label@CASH_HEADER: @@ -224,7 +224,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Cash + Text: label-basic-stats-cash-header Align: Right Shadow: True Label@POWER_HEADER: @@ -233,7 +233,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Power + Text: label-basic-stats-power-header Align: Center Shadow: True Label@KILLS_HEADER: @@ -242,7 +242,7 @@ Container@OBSERVER_WIDGETS: Width: 40 Height: PARENT_HEIGHT Font: Bold - Text: Kills + Text: label-basic-stats-kills-header Align: Right Shadow: True Label@DEATHS_HEADER: @@ -251,7 +251,7 @@ Container@OBSERVER_WIDGETS: Width: 60 Height: PARENT_HEIGHT Font: Bold - Text: Deaths + Text: label-basic-stats-deaths-header Align: Right Shadow: True Label@ASSETS_DESTROYED_HEADER: @@ -260,7 +260,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Destroyed + Text: label-basic-stats-assets-destroyed-header Align: Right Shadow: True Label@ASSETS_LOST_HEADER: @@ -269,7 +269,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Lost + Text: label-basic-stats-assets-lost-header Align: Right Shadow: True Label@EXPERIENCE_HEADER: @@ -278,7 +278,7 @@ Container@OBSERVER_WIDGETS: Width: 60 Height: PARENT_HEIGHT Font: Bold - Text: Score + Text: label-basic-stats-experience-header Align: Right Shadow: True Label@ACTIONS_MIN_HEADER: @@ -287,7 +287,7 @@ Container@OBSERVER_WIDGETS: Width: 60 Height: PARENT_HEIGHT Font: Bold - Text: APM + Text: label-basic-stats-actions-min-header Align: Right Shadow: True Container@ECONOMY_STATS_HEADERS: @@ -314,14 +314,14 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-economy-stats-player-header Shadow: True Label@CASH_HEADER: X: 155 Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Cash + Text: label-economy-stats-cash-header Align: Right Shadow: True Label@INCOME_HEADER: @@ -329,7 +329,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Income + Text: label-economy-stats-income-header Align: Right Shadow: True Label@ASSETS_HEADER: @@ -337,7 +337,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Assets + Text: label-economy-stats-assets-header Align: Right Shadow: True Label@EARNED_HEADER: @@ -345,7 +345,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Earned + Text: label-economy-stats-earned-header Align: Right Shadow: True Label@SPENT_HEADER: @@ -353,7 +353,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Spent + Text: label-economy-stats-spent-header Align: Right Shadow: True Label@HARVESTERS_HEADER: @@ -361,7 +361,7 @@ Container@OBSERVER_WIDGETS: Width: 80 Height: PARENT_HEIGHT Font: Bold - Text: Harvesters + Text: label-economy-stats-harvesters-header Align: Right Shadow: True Container@PRODUCTION_STATS_HEADERS: @@ -389,7 +389,7 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-production-stats-player-header Align: Left Shadow: True Label@PRODUCTION_HEADER: @@ -398,7 +398,7 @@ Container@OBSERVER_WIDGETS: Width: 100 Height: PARENT_HEIGHT Font: Bold - Text: Production + Text: label-production-stats-header Shadow: True Container@SUPPORT_POWERS_HEADERS: X: 0 @@ -425,7 +425,7 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-support-powers-player-header Align: Left Shadow: True Label@SUPPORT_POWERS_HEADER: @@ -434,7 +434,7 @@ Container@OBSERVER_WIDGETS: Width: 100 Height: PARENT_HEIGHT Font: Bold - Text: Support Powers + Text: label-support-powers-header Shadow: True Container@ARMY_HEADERS: X: 0 @@ -461,7 +461,7 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-army-player-header Align: Left Shadow: True Label@ARMY_HEADER: @@ -470,7 +470,7 @@ Container@OBSERVER_WIDGETS: Width: 100 Height: PARENT_HEIGHT Font: Bold - Text: Army + Text: label-army-header Shadow: True Container@COMBAT_STATS_HEADERS: X: 0 @@ -497,7 +497,7 @@ Container@OBSERVER_WIDGETS: Width: 120 Height: PARENT_HEIGHT Font: Bold - Text: Player + Text: label-combat-stats-player-header Align: Left Shadow: True Label@ASSETS_DESTROYED_HEADER: @@ -506,7 +506,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: Destroyed + Text: label-combat-stats-assets-destroyed-header Align: Right Shadow: True Label@ASSETS_LOST_HEADER: @@ -515,7 +515,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: Lost + Text: label-combat-stats-assets-lost-header Align: Right Shadow: True Label@UNITS_KILLED_HEADER: @@ -524,7 +524,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: U. Killed + Text: label-combat-stats-units-killed-header Align: Right Shadow: True Label@UNITS_DEAD_HEADER: @@ -533,7 +533,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: U. Lost + Text: label-combat-stats-units-dead-header Align: Right Shadow: True Label@BUILDINGS_KILLED_HEADER: @@ -542,7 +542,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: B. Killed + Text: label-combat-stats-buildings-killed-header Align: Right Shadow: True Label@BUILDINGS_DEAD_HEADER: @@ -551,7 +551,7 @@ Container@OBSERVER_WIDGETS: Width: 75 Height: PARENT_HEIGHT Font: Bold - Text: B. Lost + Text: label-combat-stats-buildings-dead-header Align: Right Shadow: True Label@ARMY_VALUE_HEADER: @@ -560,7 +560,7 @@ Container@OBSERVER_WIDGETS: Width: 90 Height: PARENT_HEIGHT Font: Bold - Text: Army Value + Text: label-combat-stats-army-value-header Align: Right Shadow: True Label@VISION_HEADER: @@ -569,7 +569,7 @@ Container@OBSERVER_WIDGETS: Width: 60 Height: PARENT_HEIGHT Font: Bold - Text: Vision + Text: label-combat-stats-vision-header Align: Right Shadow: True ScrollPanel@PLAYER_STATS_PANEL: diff --git a/mods/ra2/chrome/ingame-player.yaml b/mods/ra2/chrome/ingame-player.yaml index 302d07251..ce6896ab2 100644 --- a/mods/ra2/chrome/ingame-player.yaml +++ b/mods/ra2/chrome/ingame-player.yaml @@ -21,8 +21,8 @@ Container@PLAYER_WIDGETS: IconSize: 60, 48 IconSpriteOffset: -1, -1 TooltipContainer: TOOLTIP_CONTAINER - ReadyText: READY - HoldText: ON HOLD + ReadyText: supportpowers-support-powers-palette.ready + HoldText: supportpowers-support-powers-palette.hold HotkeyPrefix: SupportPower HotkeyCount: 6 Container@PALETTE_FOREGROUND: @@ -65,8 +65,8 @@ Container@PLAYER_WIDGETS: Background: Key: AttackMove DisableKeySound: true - TooltipText: Attack Move - TooltipDesc: Selected units will move to the desired location\nand attack any enemies they encounter en route.\n\nHold {(Ctrl)} while targeting to order an Assault Move\nthat attacks any units or structures encountered en route.\n\nLeft-click icon then right-click on target location. + TooltipText: button-command-bar-attack-move.tooltip + TooltipDesc: button-command-bar-attack-move.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: @@ -83,8 +83,8 @@ Container@PLAYER_WIDGETS: VisualHeight: 0 Background: DisableKeySound: true - TooltipText: Force Move - TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. + TooltipText: button-command-bar-force-move.tooltip + TooltipDesc: button-command-bar-force-move.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: @@ -101,8 +101,8 @@ Container@PLAYER_WIDGETS: VisualHeight: 0 Background: DisableKeySound: true - TooltipText: Force Attack - TooltipDesc: Selected units will attack the targeted unit or location\nignoring their default activity for the target.\n\nLeft-click icon then right-click on target.\nHold {(Ctrl)} to activate temporarily while commanding units. + TooltipText: button-command-bar-force-attack.tooltip + TooltipDesc: button-command-bar-force-attack.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: @@ -120,8 +120,8 @@ Container@PLAYER_WIDGETS: Background: Key: Guard DisableKeySound: true - TooltipText: Guard - TooltipDesc: Selected units will follow the targeted unit.\n\nLeft-click icon then right-click on target unit. + TooltipText: button-command-bar-guard.tooltip + TooltipDesc: button-command-bar-guard.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -139,8 +139,8 @@ Container@PLAYER_WIDGETS: Key: Deploy DisableKeyRepeat: true DisableKeySound: true - TooltipText: Deploy - TooltipDesc: Selected units will perform their default deploy activity\n - MCVs will unpack into a Construction Yard\n - Construction Yards will re-pack into a MCV\n - Transports will unload their passengers\n - Demolition Trucks and MAD Tanks will self-destruct\n - Aircraft will return to base\n\nActs immediately on selected units. + TooltipText: button-command-bar-deploy.tooltip + TooltipDesc: button-command-bar-deploy.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -158,8 +158,8 @@ Container@PLAYER_WIDGETS: Key: Scatter DisableKeyRepeat: true DisableKeySound: true - TooltipText: Scatter - TooltipDesc: Selected units will stop their current activity\nand move to a nearby location.\n\nActs immediately on selected units. + TooltipText: button-command-bar-scatter.tooltip + TooltipDesc: button-command-bar-scatter.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -177,8 +177,8 @@ Container@PLAYER_WIDGETS: Key: Stop DisableKeyRepeat: true DisableKeySound: true - TooltipText: Stop - TooltipDesc: Selected units will stop their current activity.\nSelected buildings will reset their rally point.\n\nActs immediately on selected targets. + TooltipText: button-command-bar-stop.tooltip + TooltipDesc: button-command-bar-stop.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -194,8 +194,8 @@ Container@PLAYER_WIDGETS: VisualHeight: 0 Background: DisableKeySound: true - TooltipText: Waypoint Mode - TooltipDesc: Use Waypoint Mode to give multiple linking commands\nto the selected units. Units will execute the commands\nimmediately upon receiving them.\n\nLeft-click icon then give commands in the game world.\nHold {(Shift)} to activate temporarily while commanding units. + TooltipText: button-command-bar-queue-orders.tooltip + TooltipDesc: button-command-bar-queue-orders.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: @@ -220,8 +220,8 @@ Container@PLAYER_WIDGETS: Key: StanceAttackAnything DisableKeyRepeat: true DisableKeySound: true - TooltipText: Attack Anything Stance - TooltipDesc: Set the selected units to Attack Anything stance:\n - Units will attack enemy units and structures on sight\n - Units will pursue attackers across the battlefield + TooltipText: button-stance-bar-attackanything.tooltip + TooltipDesc: button-stance-bar-attackanything.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -239,8 +239,8 @@ Container@PLAYER_WIDGETS: Key: StanceDefend DisableKeyRepeat: true DisableKeySound: true - TooltipText: Defend Stance - TooltipDesc: Set the selected units to Defend stance:\n - Units will attack enemy units on sight\n - Units will not move or pursue enemies + TooltipText: button-stance-bar-defend.tooltip + TooltipDesc: button-stance-bar-defend.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -258,8 +258,8 @@ Container@PLAYER_WIDGETS: Key: StanceReturnFire DisableKeyRepeat: true DisableKeySound: true - TooltipText: Return Fire Stance - TooltipDesc: Set the selected units to Return Fire stance:\n - Units will retaliate against enemies that attack them\n - Units will not move or pursue enemies + TooltipText: button-stance-bar-returnfire.tooltip + TooltipDesc: button-stance-bar-returnfire.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -277,8 +277,8 @@ Container@PLAYER_WIDGETS: Key: StanceHoldFire DisableKeyRepeat: true DisableKeySound: true - TooltipText: Hold Fire Stance - TooltipDesc: Set the selected units to Hold Fire stance:\n - Units will not fire upon enemies\n - Units will not move or pursue enemies + TooltipText: button-stance-bar-holdfire.tooltip + TooltipDesc: button-stance-bar-holdfire.tooltipdesc TooltipContainer: TOOLTIP_CONTAINER Children: Image@ICON: @@ -310,7 +310,7 @@ Container@PLAYER_WIDGETS: Width: 62 Height: 23 Background: debug-button - TooltipText: Debug Menu + TooltipText: button-top-buttons-debug-tooltip TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 MenuButton@OPTIONS_BUTTON: @@ -321,7 +321,7 @@ Container@PLAYER_WIDGETS: Width: 69 Height: 23 Background: options-button - TooltipText: Options + TooltipText: button-top-buttons-options-tooltip TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Button@REPAIR_BUTTON: @@ -332,7 +332,7 @@ Container@PLAYER_WIDGETS: Height: 34 Background: repair-button Key: Repair - TooltipText: Repair + TooltipText: button-top-buttons-repair-tooltip TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: @@ -348,7 +348,7 @@ Container@PLAYER_WIDGETS: Height: 34 Background: beacon-button Key: PlaceBeacon - TooltipText: Place Beacon + TooltipText: button-top-buttons-beacon-tooltip TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: @@ -364,7 +364,7 @@ Container@PLAYER_WIDGETS: Height: 34 Background: sell-button Key: Sell - TooltipText: Sell + TooltipText: button-top-buttons-sell-tooltip TooltipContainer: TOOLTIP_CONTAINER VisualHeight: 0 Children: @@ -417,7 +417,7 @@ Container@PLAYER_WIDGETS: Width: 50 Height: 23 Font: Bold - Text: {0} + Text: labelwithtooltip-player-widgets-cash TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: SIMPLE_TOOLTIP Children: @@ -435,7 +435,7 @@ Container@PLAYER_WIDGETS: Height: 23 Align: Right Font: Bold - Text: {0} + Text: labelwithtooltip-player-widgets-power TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: SIMPLE_TOOLTIP Children: @@ -487,8 +487,8 @@ Container@PLAYER_WIDGETS: X: 24 Y: 2 TooltipContainer: TOOLTIP_CONTAINER - ReadyText: READY - HoldText: ON HOLD + ReadyText: productionpalette-sidebar-production-palette.ready + HoldText: productionpalette-sidebar-production-palette.hold IconSize: 60, 48 IconMargin: 2, 2 IconSpriteOffset: -1, -1 @@ -508,7 +508,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: buildings-button - TooltipText: Buildings + TooltipText: button-production-types-building-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Building Key: ProductionTypeBuilding @@ -525,7 +525,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: support-button - TooltipText: Support + TooltipText: button-production-types-support-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Support Key: ProductionTypeDefense @@ -542,7 +542,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: infantry-button - TooltipText: Infantry + TooltipText: button-production-types-infantry-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Infantry Key: ProductionTypeInfantry @@ -559,7 +559,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: vehicles-button - TooltipText: Vehicles + TooltipText: button-production-types-vehicle-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Vehicle Key: ProductionTypeVehicle @@ -576,7 +576,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: aircrafts-button - TooltipText: Aircraft + TooltipText: button-production-types-aircraft-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Aircraft Key: ProductionTypeAircraft @@ -593,7 +593,7 @@ Container@PLAYER_WIDGETS: Height: 32 VisualHeight: 0 Background: ships-button - TooltipText: Naval + TooltipText: button-production-types-naval-tooltip TooltipContainer: TOOLTIP_CONTAINER ProductionGroup: Ship Key: ProductionTypeNaval @@ -611,7 +611,7 @@ Container@PLAYER_WIDGETS: Height: 27 VisualHeight: 0 Background: scrollup-buttons - TooltipText: Scroll up + TooltipText: button-production-types-scroll-up-tooltip TooltipContainer: TOOLTIP_CONTAINER Button@SCROLL_DOWN_BUTTON: Logic: AddFactionSuffixLogic @@ -621,7 +621,7 @@ Container@PLAYER_WIDGETS: Height: 27 VisualHeight: 0 Background: scrolldown-buttons - TooltipText: Scroll down + TooltipText: button-production-types-scroll-down-tooltip TooltipContainer: TOOLTIP_CONTAINER Container@HPF_OVERLAY: Logic: HierarchicalPathFinderOverlayLogic @@ -633,11 +633,11 @@ Container@PLAYER_WIDGETS: DropDownButton@HPF_OVERLAY_LOCOMOTOR: Width: PARENT_WIDTH Height: 25 - Text: Select Locomotor + Text: dropdownbutton-hpf-overlay-locomotor Font: Regular DropDownButton@HPF_OVERLAY_CHECK: Y: 0 + 35 Width: PARENT_WIDTH Height: 25 - Text: Select BlockedByActor + Text: dropdownbutton-hpf-overlay-check Font: Regular diff --git a/mods/ra2/chrome/mainmenu-prerelease-notification.yaml b/mods/ra2/chrome/mainmenu-prerelease-notification.yaml index 6bf574986..88688ff56 100644 --- a/mods/ra2/chrome/mainmenu-prerelease-notification.yaml +++ b/mods/ra2/chrome/mainmenu-prerelease-notification.yaml @@ -11,35 +11,35 @@ Background@MAINMENU_PRERELEASE_NOTIFICATION: Height: 25 Font: Bold Align: Center - Text: Red Alert 2 developer preview + Text: label-mainmenu-prerelease-notification-prompt-title Label@PROMPT_TEXT_A: X: 15 Y: 50 Width: PARENT_WIDTH - 30 Height: 16 Align: Center - Text: This pre-alpha build of OpenRA's Red Alert 2 mod is made available + Text: label-mainmenu-prerelease-notification-prompt-text-a Label@PROMPT_TEXT_B: X: 15 Y: 68 Width: PARENT_WIDTH - 30 Height: 16 Align: Center - Text: for the community to follow development and as example for modders. + Text: label-mainmenu-prerelease-notification-prompt-text-b Label@PROMPT_TEXT_C: X: 15 Y: 104 Width: PARENT_WIDTH - 30 Height: 16 Align: Center - Text: Many features are missing or incomplete, performance has not been + Text: label-mainmenu-prerelease-notification-prompt-text-c Label@PROMPT_TEXT_D: X: 15 Y: 122 Width: PARENT_WIDTH - 30 Height: 16 Align: Center - Text: optimized, and balance will not be addressed until a future beta. + Text: label-mainmenu-prerelease-notification-prompt-text-d Label@PROMPT_TEXT_E: X: 15 Y: 140 @@ -51,5 +51,5 @@ Background@MAINMENU_PRERELEASE_NOTIFICATION: Y: PARENT_HEIGHT - 45 Width: 120 Height: 25 - Text: I Understand + Text: button-mainmenu-prerelease-notification-continue Font: Bold diff --git a/mods/ra2/fluent/chrome.ftl b/mods/ra2/fluent/chrome.ftl new file mode 100644 index 000000000..6cd110093 --- /dev/null +++ b/mods/ra2/fluent/chrome.ftl @@ -0,0 +1,202 @@ + +## ingame-debug.yaml +label-debug-panel-title = Debug Options +checkbox-debug-panel-instant-build = Instant Build Speed +checkbox-debug-panel-enable-tech = Build Everything +checkbox-debug-panel-build-anywhere = Build Anywhere +checkbox-debug-panel-unlimited-power = Unlimited Power +checkbox-debug-panel-instant-charge = Instant Charge Time +checkbox-debug-panel-disable-visibility-checks = Disable Visibility Checks +button-debug-panel-give-cash = Give $20,000 +button-debug-panel-grow-resources = Grow Resources +button-debug-panel-give-exploration = Clear Shroud +button-debug-panel-reset-exploration = Reset Shroud +label-debug-panel-visualizations-title = Visualizations +checkbox-debug-panel-show-unit-paths = Show Unit Paths +checkbox-debug-panel-show-customterrain-overlay = Show Custom Terrain +checkbox-debug-panel-show-actor-tags = Show Actor Tags +checkbox-debug-panel-show-depth-preview = Show Depth Data +checkbox-debug-panel-show-combatoverlay = Show Combat Geometry +checkbox-debug-panel-show-geometry = Show Render Geometry +checkbox-debug-panel-show-terrain-overlay = Show Terrain Geometry +checkbox-debug-panel-show-screenmap = Show Screen Map + +## ingame-observer.yaml +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 + +label-basic-stats-player-header = Player +label-basic-stats-cash-header = Cash +label-basic-stats-power-header = Power +label-basic-stats-kills-header = Kills +label-basic-stats-deaths-header = Deaths +label-basic-stats-assets-destroyed-header = Destroyed +label-basic-stats-assets-lost-header = Lost +label-basic-stats-experience-header = Score +label-basic-stats-actions-min-header = APM +label-economy-stats-player-header = Player +label-economy-stats-cash-header = Cash +label-economy-stats-income-header = Income +label-economy-stats-assets-header = Assets +label-economy-stats-earned-header = Earned +label-economy-stats-spent-header = Spent +label-economy-stats-harvesters-header = Harvesters +label-production-stats-player-header = Player +label-production-stats-header = Production +label-support-powers-player-header = Player +label-support-powers-header = Support Powers +label-army-player-header = Player +label-army-header = Army +label-combat-stats-player-header = Player +label-combat-stats-assets-destroyed-header = Destroyed +label-combat-stats-assets-lost-header = Lost +label-combat-stats-units-killed-header = U. Killed +label-combat-stats-units-dead-header = U. Lost +label-combat-stats-buildings-killed-header = B. Killed +label-combat-stats-buildings-dead-header = B. Lost +label-combat-stats-army-value-header = Army Value +label-combat-stats-vision-header = Vision + +## ingame-player.yaml +supportpowers-support-powers-palette = + .ready = READY + .hold = ON HOLD + +button-command-bar-attack-move = + .tooltip = Attack Move + .tooltipdesc = Selected units will move to the desired location + and attack any enemies they encounter en route. + + Hold <(Ctrl)> while targeting to order an Assault Move + that attacks any units or structures encountered en route. + + Left-click icon then right-click on target location. + +button-command-bar-force-move = + .tooltip = Force Move + .tooltipdesc = Selected units will move to the desired location + - Default activity for the target is suppressed + - Vehicles will attempt to crush enemies at the target location + + Left-click icon then right-click on target. + Hold <(Alt)> to activate temporarily while commanding units. + +button-command-bar-force-attack = + .tooltip = Force Attack + .tooltipdesc = Selected units will attack the targeted unit or location + ignoring their default activity for the target. + + Left-click icon then right-click on target. + Hold <(Ctrl)> to activate temporarily while commanding units. + +button-command-bar-guard = + .tooltip = Guard + .tooltipdesc = Selected units will follow the targeted unit. + + Left-click icon then right-click on target unit. + +button-command-bar-deploy = + .tooltip = Deploy + .tooltipdesc = Selected units will perform their default deploy activity + - MCVs will unpack into a Construction Yard + - Construction Yards will re-pack into a MCV + - Transports will unload their passengers + - Demolition Trucks and MAD Tanks will self-destruct + - Aircraft will return to base + + Acts immediately on selected units. + +button-command-bar-scatter = + .tooltip = Scatter + .tooltipdesc = Selected units will stop their current activity + and move to a nearby location. + + Acts immediately on selected units. + +button-command-bar-stop = + .tooltip = Stop + .tooltipdesc = Selected units will stop their current activity. + Selected buildings will reset their rally point. + + Acts immediately on selected targets. + +button-command-bar-queue-orders = + .tooltip = Waypoint Mode + .tooltipdesc = Use Waypoint Mode to give multiple linking commands + to the selected units. Units will execute the commands + immediately upon receiving them. + + Left-click icon then give commands in the game world. + Hold <(Shift)> to activate temporarily while commanding units. + +button-stance-bar-attackanything = + .tooltip = Attack Anything Stance + .tooltipdesc = Set the selected units to Attack Anything stance: + - Units will attack enemy units and structures on sight + - Units will pursue attackers across the battlefield + +button-stance-bar-defend = + .tooltip = Defend Stance + .tooltipdesc = Set the selected units to Defend stance: + - Units will attack enemy units on sight + - Units will not move or pursue enemies + +button-stance-bar-returnfire = + .tooltip = Return Fire Stance + .tooltipdesc = Set the selected units to Return Fire stance: + - Units will retaliate against enemies that attack them + - Units will not move or pursue enemies + +button-stance-bar-holdfire = + .tooltip = Hold Fire Stance + .tooltipdesc = Set the selected units to Hold Fire stance: + - Units will not fire upon enemies + - Units will not move or pursue enemies + +button-top-buttons-debug-tooltip = Debug Menu +button-top-buttons-options-tooltip = Options +button-top-buttons-repair-tooltip = Repair +button-top-buttons-beacon-tooltip = Place Beacon +button-top-buttons-sell-tooltip = Sell +labelwithtooltip-player-widgets-cash = <0> +labelwithtooltip-player-widgets-power = <0> + +productionpalette-sidebar-production-palette = + .ready = READY + .hold = ON HOLD + +button-production-types-building-tooltip = Buildings +button-production-types-support-tooltip = Support +button-production-types-infantry-tooltip = Infantry +button-production-types-vehicle-tooltip = Vehicles +button-production-types-aircraft-tooltip = Aircraft +button-production-types-naval-tooltip = Naval +button-production-types-scroll-up-tooltip = Scroll up +button-production-types-scroll-down-tooltip = Scroll down +dropdownbutton-hpf-overlay-locomotor = Select Locomotor +dropdownbutton-hpf-overlay-check = Select BlockedByActor + +## mainmenu-prerelease-notification.yaml +label-mainmenu-prerelease-notification-prompt-title = Red Alert 2 developer preview +label-mainmenu-prerelease-notification-prompt-text-a = This pre-alpha build of OpenRA's Red Alert 2 mod is made available +label-mainmenu-prerelease-notification-prompt-text-b = for the community to follow development and as example for modders. +label-mainmenu-prerelease-notification-prompt-text-c = Many features are missing or incomplete, performance has not been +label-mainmenu-prerelease-notification-prompt-text-d = optimized, and balance will not be addressed until a future beta. +button-mainmenu-prerelease-notification-continue = I Understand diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index e86622bda..901fe80b6 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -205,6 +205,7 @@ FluentMessages: common|fluent/chrome.ftl common|fluent/hotkeys.ftl common|fluent/rules.ftl + ra2|fluent/chrome.ftl ra2|fluent/mod.ftl ra2|fluent/rules.ftl From acf430c4cc87b0e189d38ba527a6f3128368816d Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 22 Apr 2025 22:43:54 +0300 Subject: [PATCH 16/21] Ran automatic extraction of rule strings OpenRA PR 21204? Run utility command --extract-yaml-strings. --- mods/ra2/fluent/rules.ftl | 863 ++++++++++++++++++++++++ mods/ra2/rules/ai.yaml | 2 +- mods/ra2/rules/aircraft.yaml | 34 +- mods/ra2/rules/allied-infantry.yaml | 48 +- mods/ra2/rules/allied-naval.yaml | 20 +- mods/ra2/rules/allied-structures.yaml | 100 +-- mods/ra2/rules/allied-vehicles.yaml | 32 +- mods/ra2/rules/animals.yaml | 8 +- mods/ra2/rules/bridges.yaml | 38 +- mods/ra2/rules/civilian-naval.yaml | 6 +- mods/ra2/rules/civilian-props.yaml | 66 +- mods/ra2/rules/civilian-structures.yaml | 170 ++--- mods/ra2/rules/civilian-vehicles.yaml | 34 +- mods/ra2/rules/civilians.yaml | 28 +- mods/ra2/rules/defaults.yaml | 32 +- mods/ra2/rules/misc.yaml | 22 +- mods/ra2/rules/soviet-infantry.yaml | 36 +- mods/ra2/rules/soviet-naval.yaml | 16 +- mods/ra2/rules/soviet-structures.yaml | 80 +-- mods/ra2/rules/soviet-vehicles.yaml | 32 +- mods/ra2/rules/tech-structures.yaml | 18 +- mods/ra2/rules/world.yaml | 48 +- 22 files changed, 1298 insertions(+), 435 deletions(-) diff --git a/mods/ra2/fluent/rules.ftl b/mods/ra2/fluent/rules.ftl index 41e843141..9303a393b 100644 --- a/mods/ra2/fluent/rules.ftl +++ b/mods/ra2/fluent/rules.ftl @@ -18,3 +18,866 @@ options-starting-units = options-difficulty = .normal = Normal + +## ai.yaml +actor-player-modularbot-testai-name = Test AI + +## aircraft.yaml +actor-shad = + .name = Night Hawk + .description = + Infantry Transport Helicopter + Undetectable by radar. + Strong vs Infantry + Weak vs Vehicles, Aircraft + +actor-shadhusk-name = Night Hawk +actor-zep-name = Kirov Airship +actor-zephusk-name = Kirov Airship + +actor-orca = + .name = Harrier + .description = + Fast assault fighter + Strong vs Buildings, Vehicles + Weak vs Infantry, Aircraft + +actor-orcahusk-name = Harrier +actor-beag-name = Black Eagle +actor-beaghusk-name = Black Eagle +actor-pdplane-name = Cargo Plane +actor-pdplanehusk-name = Cargo Plane +actor-hornet-name = Hornet +actor-hornethusk-name = Hornet +actor-asw-name = Osprey + +actor-aswhusk = + .name = Osprey + .norow--name = Osprey + +## allied-infantry.yaml +actor-engineer = + .description = + Captures enemy structures. + Unarmed + .name = Engineer + +actor-dog = + .description = + Anti-infantry unit. + Can detect cloaked units and spies. + Strong vs Infantry + Weak vs Vehicles, Aircraft + .name = Attack Dog + +actor-e1 = + .description = + General-purpose infantry. + Strong vs Infantry + Weak vs Vehicles, Aircraft + .name = G.I. + +actor-snipe = + .name = Sniper + .description = + Special anti-infantry unit. + Strong vs Infantry + Weak vs Vehicles, Aircraft + +actor-spy = + .description = + Infiltrates enemy structures for intel or + sabotage. Exact effect depends on the + building infiltrated. + Unarmed + Special Ability: Disguises + .disguisetooltip-name = Spy + .disguisetooltip-generic-name = Soldier + +actor-ghost = + .description = + Elite commando infantry, armed with + a sub machine gun and C4. + Strong vs Infantry, Buildings + Weak vs Vehicles, Aircraft + Special Ability: Destroy Building with C4 + .name = Navy SEAL + +actor-ccomand = + .description = + Elite commando infantry, armed with + a sub machine gun and C4. + Strong vs Infantry, Buildings + Weak vs Vehicles, Aircraft + Special Ability: Destroy Building with C4 + .name = Chrono Commando + +actor-ptroop = + .description = + Psychic infantry. Can mind control enemy units. + Strong vs Infantry, Vehicles, Buildings + Weak vs Dogs, Terror Drones, Aircraft + Special Ability: Destroy Building with C4 + .name = Psi Commando + +actor-tany = + .description = + Elite commando infantry, armed with + dual pistols and C4. + Strong vs Infantry, Buildings + Weak vs Vehicles, Aircraft + Special Ability: Destroy Building with C4 + + Maximum 1 can be trained. + .name = Tanya + +actor-jumpjet = + .description = + Airborne soldier. + Strong vs Infantry, Aircraft + Weak vs Vehicles + .name = Rocketeer + +actor-jumpjet-husk-name = Rocketeer + +actor-cleg = + .name = Chrono Legionnaire + .description = + High-tech soldier. + Strong vs Infantry, Vehicles + Weak vs Aircraft + +## allied-naval.yaml +actor-lcrf = + .description = + General-purpose naval transport. + Can carry infantry and vehicles. + Unarmed + .name = Amphibious Transport + +actor-dest = + .description = + Allied Main Battle Ship armed with cannons and + an Osprey helicopter. + Can detect submarines and sea animals. + Strong vs Naval units + Weak vs Ground units, Aircraft + .name = Destroyer + +actor-aegis = + .description = + Anti-Air naval unit. + Strong vs Aircraft + Grounds units, Ships + .name = Aegis Cruiser + +actor-dlph = + .description = + Trained dolphin + armed with sonic beams. + Strong vs Ships + .name = Dolphin + +actor-carrier = + .description = + Aircraft carrier ship. + Strong vs Tanks, Structures + Weak vs Infantry + .name = Aircraft Carrier + +## allied-structures.yaml +actor-gacnst = + .description = Builds base structures. + .name = Construction Yard + +actor-gapowr = + .description = Provides power for other structures. + .name = Power Plant + +actor-gapile = + .description = Trains infantry. + .name = Barracks + +actor-garefn = + .description = Processes ore into credits. + .name = Ore Refinery + +actor-gaairc = + .description = + Provides radar + Supports 4 aircraft. + .name = Airforce Command Headquarters + +actor-amradr = + .name = American Airforce Command Headquarters + .paratrooperspower-paratroopers-name = American Paratroopers + .paratrooperspower-paratroopers-description = + A Cargo Plane drops eight GIs + anywhere on the map. + +actor-gaweap = + .description = Produces vehicles. + .name = War Factory + +actor-gayard = + .name = Naval Yard + .description = + Produces and repairs ships, + submarines, transports, and other naval units. + +actor-gadept = + .description = Repairs vehicles and removes Terror Drones (for a price). + .name = Service Depot + +actor-gatech = + .description = Allows deployment of advanced units. + .name = Battle Lab + +actor-gawall = + .description = + Light wall. + Crushable by vehicles. + .name = Allied Wall + +actor-gapill = + .description = Automated anti-infantry defense. + .name = Pill Box + +actor-nasam = + .description = Automated anti-aircraft defense. + .name = Patriot Missile System + +actor-gtgcan = + .description = Automated, long ranged anti-ground defense. + .name = Grand Cannon + +actor-gaorep = + .description = Refines all forms of income by 25%. + .name = Ore Purifier + +actor-gaspysat = + .description = Reveals the entire battlefield. + .name = Spy Satellite Uplink + +actor-gagap = + .name = Gap Generator + .description = + Obscures the enemy's view with shroud. + Requires power to operate. + +actor-gaweat = + .description = Play God with deadly weather! + .name = Weather Controller + .weathercontrolsupportpower-lightningstorm-name = Weather Storm + .weathercontrolsupportpower-lightningstorm-description = Control the weather to destroy enemy forces. + +actor-gacsph = + .description = Allows teleporting units in a 3x3 array. + .name = Chronosphere + .chronoshiftpower-chronoshift-name = Chronosphere + .chronoshiftpower-chronoshift-description = + Teleports a group of units across + the map. + +actor-atesla = + .description = + Advanced base defense. + Requires power to operate. + Strong vs Infantry, Vehicles + Weak vs Aircraft + .name = Prism Tower + +actor-power-name = Power Plant +actor-refinery-name = Ore Refinery +actor-barracks-name = Infantry Production +actor-radar-name = Radar +actor-repairpad-name = Service Depot + +## allied-vehicles.yaml +actor-amcv = + .description = Deploys into a Construction Yard. + .name = Mobile Construction Vehicle + +actor-cmin = + .description = + Gathers Ore. + Unarmed + Special ability: Can teleport to own refineries + .name = Chrono Miner + +actor-mtnk = + .name = Grizzly Battle Tank + .description = + Allied Main Battle Tank. + Strong vs Vehicles, Ships + Weak vs Infantry, Aircraft + +actor-tnkd = + .name = Tank Destroyer + .description = + Special anti-armor unit. + Strong vs Vehicles, Ships + Weak vs Infantry, Aircraft + +actor-fv = + .name = Infantry Fighting Vehicle + .description = + Multi-Purpose Vehicle. + Without passenger: + Strong vs Infantry, Aircraft + Weak vs Vehicles, Ships + Special Ability: Armament depends on passenger. + +actor-sref = + .description = + Fires deadly beams of light. + Strong vs Infantry, Vehicles + Weak vs Aircraft + .name = Prism Tank + +actor-mgtk = + .description = + As tree disguised tank. + Strong vs Infantry, Vehicles + Weak vs Aircraft + .name = Mirage Tank + .miragetooltip-tree-name = Mirage Tank + .miragetooltip-tree-generic-name = Tree + +## animals.yaml +actor-cow-name = Cow +actor-all-name = Alligator +actor-polarb-name = Polar Bear +actor-josh-name = Monkey + +## bridges.yaml +actor-cabhut-name = Bridge Repair Hut +meta-lowbridgeramp-name = Wooden Bridge +actor-lobrdb-a-name = Concrete Bridge +actor-lobrdb-a-d-name = Dead Bridge +actor-lobrdb-b-name = Concrete Bridge +actor-lobrdb-b-d-name = Dead Bridge +actor-lobrdb-r-se-name = Bridge Ramp +actor-lobrdb-r-nw-name = Bridge Ramp +actor-lobrdb-r-ne-name = Bridge Ramp +actor-lobrdb-r-sw-name = Bridge Ramp +actor-lobrdg-a-d-name = Dead Bridge +actor-lobrdg-b-d-name = Dead Bridge +actor-lobrdg-r-se-name = Bridge Ramp +actor-lobrdg-r-nw-name = Bridge Ramp +actor-lobrdg-r-ne-name = Bridge Ramp +actor-lobrdg-r-sw-name = Bridge Ramp +meta-elevatedbridgeplaceholder-name = Concrete Bridge +actor-bridgb1-name = Wooden Bridge +actor-bridgb2-name = Wooden Bridge + +## civilian-naval.yaml +actor-tug-name = Tug Boat +actor-cruise-name = Cruise Ship +actor-cdest-name = Coast Guard Boat + +## civilian-props.yaml +actor-camisc01-name = Barrels +actor-camisc02-name = Barrel +actor-camisc03-name = Dumpster +actor-camisc04-name = Mailbox +actor-camisc05-name = Pipes +actor-camisc06-name = V3 Ammunition +actor-camsc11-name = Tires +actor-camsc12-name = Practice Target +actor-camsc13-name = Derelict Tank +actor-ammocrat-name = Ammo Crates +actor-camsc01-name = Hot Dog Stand +actor-camsc02-name = Beach Umbrellas +actor-camsc03-name = Beach Umbrellas +actor-camsc04-name = Beach Towels +actor-camsc05-name = Beach Towels +actor-camsc06-name = Camp Fire +actor-caeuro05-name = Statue +actor-capark01-name = Park Bench +actor-capark02-name = Swing Set +actor-capark03-name = Merry Go Round +actor-castrt01-name = Traffic Light +actor-castrt02-name = Traffic Light +actor-castrt03-name = Traffic Light +actor-castrt04-name = Traffic Light +actor-castrt05-name = Bus Stop +actor-camov01-name = Drive In Movie Screen +actor-camov02-name = Drive In Movie Concession Stand +actor-pole01-name = Utility Pole +actor-pole02-name = Utility Pole +actor-hdstn01-name = AlringtonStones +actor-spkr01-name = Drive-In Speaker +actor-cakrmw-name = Kremlin Walls +actor-gagate-a-name = Guard Border Crossing + +## civilian-structures.yaml +actor-cafncb-name = Black Fence +actor-cafncw-name = White Fence +actor-gasand-name = Sandbags +actor-cafncp-name = Prison Camp Fence +actor-cawt01-name = Water Tower +actor-cats01-name = Twin Silos +actor-cabarn02-name = Barn +actor-cawash01-name = White House +actor-cawsh12-name = Washington Monument +actor-cawash14-name = Jefferson Memorial +actor-cawash15-name = Lincoln Memorial +actor-cawash16-name = Smithsonian Castle +actor-cawash17-name = Smithsonian Natural History Museum +actor-cawash18-name = White House Fountain +actor-cawash19-name = Iwo Jima Memorial +actor-canewy04-name = Statue of Liberty +actor-canewy05-name = World Trade Center +actor-canewy20-name = Warehouse +actor-canewy21-name = Warehouse +actor-caswst01-name = Southwest Building +actor-caarmy01-name = Army Tent +actor-caarmy02-name = Army Tent +actor-caarmy03-name = Army Tent +actor-caarmy04-name = Army Tent +actor-cafarm01-name = Farm +actor-cafarm02-name = Farm Silo +actor-cafarm06-name = Lighthouse +actor-causfgl-name = US Flag +actor-carufgl-name = Russian Flag +actor-cairfgl-name = Iraqi Flag +actor-capofgl-name = Polish Flag +actor-caskfgl-name = South Korean Flag +actor-calbfgl-name = Libyan Flag +actor-cafrfgl-name = French Flag +actor-cagefgl-name = German Flag +actor-cacufgl-name = Cuban Flag +actor-caukfgl-name = British Flag +actor-cacolo01-name = Air Force Academy Chapel +actor-caind01-name = Factory +actor-calab-name = Einstein's Lab +actor-cagas01-name = Gas Station +actor-galite-name = Light Post +actor-city05-name = Battersea Power Station +actor-catech01-name = Communications Center +actor-catexs02-name = Alamo +actor-capars01-name = Eiffel Tower +actor-capars07-name = Phone Booth +actor-capars10-name = Bistro +actor-capars11-name = Arc de Triumphe +actor-capars12-name = Notre Dame +actor-capars13-name = Bistro +actor-capars14-name = Bistro +actor-cafrma-name = Farmhouse +actor-cafrmb-name = Outhouse +actor-caprs03-name = Louvre +actor-cagard01-name = Guard Shack +actor-carus01-name = St. Basil's Cathedral +actor-carus02g-name = Kremlin Wall Clock Tower +actor-carus03-name = Kremlin Palace +actor-camiam04-name = Lifeguard Hut +actor-camiam08-name = Arizona Memorial +actor-camex01-name = Mayan Pyramid +actor-camex02-name = Mayan Castillo +actor-camex03-name = Mayan Minor Temple +actor-camex04-name = Mayan Large Temple +actor-camex05-name = Mayan Platfrom +actor-caeur1-name = Cottage +actor-caeur2-name = Cottage +actor-cachig04-name = Associates Center +actor-cachig05-name = Sears Tower +actor-cachig06-name = Water Tower +actor-castl05a-name = Stadium +actor-castl05b-name = Stadium +actor-castl05c-name = Stadium +actor-castl05d-name = Stadium +actor-castl05e-name = Stadium +actor-castl05f-name = Stadium +actor-castl05g-name = Stadium +actor-castl05h-name = Stadium +actor-camsc07-name = Hut +actor-camsc08-name = Hut +actor-camsc09-name = Hut +actor-camsc10-name = McBurger Kong +actor-cabunk01-name = Concrete Bunker +actor-cabunk02-name = Concrete Bunker + +## civilian-vehicles.yaml +actor-bus-name = School Bus +actor-limo-name = Presidential Limousine +actor-pick-name = Pickup Truck +actor-car-name = Automobile +actor-wini-name = Recreational Vehicle +actor-propa-name = Propaganda Truck +actor-cop-name = Police Car +actor-euroc-name = European Car +actor-cona-name = Excavator +actor-trucka-name = Truck +actor-truckb-name = Truck +actor-suvb-name = Black SUV +actor-suvw-name = White SUV + +actor-stang = + .name = Mustang + .generic-name = Sports Car + +actor-ptruck-name = Pickup Truck +actor-taxi-name = Taxi + +## civilians.yaml +actor-civa-name = Texan +actor-civb-name = Texan +actor-civc-name = Texan +actor-civbbp-name = Baseball Player +actor-civbfm-name = Beach Fat Male +actor-civbf-name = Beach Fat Female +actor-civbtm-name = Beach Thin Male +actor-civsfm-name = Snow Fat Male +actor-civsf-name = Snow Fat Male +actor-civstm-name = Snow Thin Male +actor-vladimir-name = Vladimir +actor-pentgen-name = Pentagon General +actor-ssrv-name = Secret Service +actor-pres-name = President + +## defaults.yaml +meta-civbuilding-name = Civilian Building + +meta-civilianinfantry = + .name = Civilian + .generic-name = Civilian + +meta-civvehicle-generic-name = Civilian Vehicle +meta-husk-generic-name = Destroyed Aircraft +meta-ship-generic-name = Ship +meta-oredrill-name = Ore Drill +meta-tree-name = Tree +meta-streetsign-name = Street Sign +meta-trafficlight-name = Traffic Light +meta-streetlight-name = Street Light +meta-rock-name = Rock + +meta-crate = + .name = Crate + .generic-name = Crate + +## misc.yaml +actor-mpspawn-name = (Multiplayer Spawnpoint) +actor-waypoint-name = (Waypoint for scripted behavior) +actor-camera-name = (reveals area to owner) +actor-ingalite-name = (Invisible Light Post) +actor-neglamp-name = (Invisible Negative Light Post) +actor-inyelwlamp-name = (Invisible Yellow Light Post) +actor-inpurplamp-name = (Invisible Purple Light Post) +actor-inoranlamp-name = (Invisible Orange Light Post) +actor-ingrnlmp-name = (Invisible Green Light Post) +actor-inredlmp-name = (Invisible Red Light Post) +actor-inblulmp-name = (Invisible Blue Light Post) + +## soviet-infantry.yaml +actor-e2 = + .description = + Cheap rifle infantry. + Strong vs Infantry + Weak vs Vehicles, Aircraft + .name = Conscript + +actor-flakt = + .description = + Anti-Air/Anti-Infantry unit. + Strong vs Aircraft, Infantry + Weak vs Vehicles + .name = Flak Trooper + +actor-shk = + .description = + Special armored unit using electricity. + Strong vs Infantry, Light armor + Weak vs Tanks, Aircraft + Special ability: Charge tesla coils + .name = Tesla Trooper + +actor-terror = + .description = + Carries C4 charges taped to his body and kamikazes enemies + blowing them up quickly and efficiently. + Strong vs Ground units + Weak vs Aircraft + .name = Terrorist + +actor-deso = + .description = + Carries a radiation-emitting weapon. + Can deploy for area-of-effect damage. + Strong vs Infantry, Light armor + Weak vs Tanks, Aircraft + .name = Desolator + +actor-ivan = + .description = Specialist for explosives. Can plant a Bomb on anything, even Cows. + .name = Crazy Ivan + +actor-civan = + .description = Specialist for explosives. Can plant a Bomb on anything, even Cows. Can teleport on anywhere on the map. + .name = Chrono Ivan + +actor-yuri = + .description = + Psychic infantry. Can mind control enemy units. + Can be deployed to unleash a powerful psychic wave. + Strong vs Infantry, Vehicles + Weak vs Terror Drones, Aircraft, Buildings + .name = Yuri + +actor-yuripr = + .description = + Psychic infantry. Can mind control enemy units from a great range. + Can be deployed to unleash a powerful psychic wave. + Strong vs Infantry, Vehicles + Weak vs Terror Drones, Aircraft, Buildings + + Maximum 1 can be trained. + .name = Yuri Prime + +## soviet-naval.yaml +actor-sapc = + .description = + General-purpose naval transport. + Can carry infantry and vehicles. + Unarmed + .name = Amphibious Transport + +actor-sub = + .description = + Submerged anti-ship unit armed with + torpedoes. + Can detect other submarines and Giant Squids. + Strong vs Ships + Weak vs Ground units, Aircraft + Special Ability: Submerge + .name = Typhoon Attack Sub + +actor-hyd = + .description = + Anti-Air/Anti-Infantry naval unit. + Strong vs Aircraft, Infantry + Weak vs Vehicles, Naval Units + .name = Sea Scorpion + +actor-sqd = + .description = + Ocean creature + punches enemies in close combat. + Strong vs Ships + .name = Giant Squid + +## soviet-structures.yaml +actor-nacnst = + .description = Allows construction of base structures. + .name = Construction Yard + +actor-napowr = + .description = Provides power for other structures. + .name = Tesla Reactor + +actor-nahand = + .description = Produces infantry. + .name = Barracks + +actor-narefn = + .description = Processes ore into credits. + .name = Ore Refinery + +actor-naradr = + .description = Provides radar. + .name = Radar Tower + +actor-naweap = + .description = Produces vehicles. + .name = War Factory + +actor-nayard = + .name = Naval Yard + .description = + Produces and repairs ships, + submarines, transports, and other naval units. + +actor-nadept = + .description = Repairs vehicles and removes Terror Drones (for a price). + .name = Service Depot + +actor-nanrct = + .description = Provides power for other structures. + .name = Nuclear Reactor + +actor-natech = + .description = Allows deployment of advanced units. + .name = Battle Lab + +actor-naclon = + .description = Clones most trained infantry. + .name = Cloning Vats + +actor-napsis = + .description = Detects enemy units and strikepoints + .name = Psychic Sensor + +actor-nairon = + .description = + Grants invulnerability to armored units. + Fries fleshy units. + .name = Iron Curtain Device + .grantexternalconditionpower-ironcurtain-name = Iron Curtain + .grantexternalconditionpower-ironcurtain-description = + Makes a group of units invulnerable + for 20 seconds. + +actor-namisl = + .description = + Provides an atomic bomb. + Requires power to operate. + Special Ability: Atom Bomb + Maximum 1 can be built. + .name = Nuclear Missile Silo + .nukepower-name = Nuclear Missile + .nukepower-description = + Launches a devastating atomic bomb + at a target location. + +actor-nawall = + .description = + Light wall. + Crushable by vehicles. + .name = Soviet Wall + +actor-naflak = + .description = Automated anti-aircraft defense. + .name = Flak Cannon + +actor-tesla = + .description = + Advanced base defense. + Requires power to operate. + Strong vs Infantry, Vehicles + Weak vs Aircraft + .name = Tesla Coil + +actor-nalasr = + .description = Automated anti-infantry defense. + .name = Sentry Gun + +## soviet-vehicles.yaml +actor-smcv = + .description = Deploys into a Construction Yard. + .name = Mobile Construction Vehicle + +actor-harv = + .description = + Gathers Ore. + Strong vs Infantry + Weak vs Vehicles, Aircraft + .name = War Miner + +actor-dron = + .name = Terror Drone + .description = + Strong vs Infantry, Vehicles + Weak vs Aircraft + +actor-htk = + .name = Flak Track + .description = + Infantry Transport and Anti-Air/Anti-Infantry vehicle. + Strong vs Aircraft, Infantry + Weak vs Vehicles + +actor-htnk = + .name = Rhino Heavy Tank + .description = + Soviet Main Battle Tank. + Strong vs Vehicles + Weak vs Infantry, Aircraft + +actor-apoc = + .name = Apocalypse Tank + .description = + Soviet Advanced Battle Tank with Double Barrel + and Anti-Aircraft Missile Launcher. + Strong vs Vehicles, Aircraft + Weak vs Infantry + +actor-ttnk = + .name = Tesla Tank + .description = + Russian special tank armed with dual small Tesla Coils. + Strong vs Vehicles, Infantry + Weak vs Aircraft + +actor-dtruck = + .description = Demolition Truck, actively armed with nuclear explosives. + .name = Demolition Truck + +## tech-structures.yaml +actor-caoild-name = Tech Oil Derrick + +actor-caairp = + .name = Tech Airport + .paratrooperspower-allies-name = Allied Paratroopers + .paratrooperspower-allies-description = + A Cargo Plane drops six GIs + anywhere on the map. + .paratrooperspower-soviets-name = Soviet Paratroopers + .paratrooperspower-soviets-description = + A Cargo Plane drops nine conscripts + anywhere on the map. + +actor-cahosp-name = Civilian Hospital +actor-cathosp-name = Tech Hospital +actor-caoutp-name = Tech Outpost + +## world.yaml +meta-baseworld = + .faction-random-name = Random + .faction-random-description = + Random Country + A random country will be chosen when the game starts. + .faction-allies-name = Allies + .faction-allies-description = + Random Allied Country + A random Allied country will be chosen when the game starts. + .faction-soviets-name = Soviets + .faction-soviets-description = + Random Soviet Country + A random Soviet country will be chosen when the game starts. + .faction-1-name = America + .faction-1-description = + America + Special Ability: Paratroopers + .faction-2-name = Germany + .faction-2-description = + Germany + Special Vehicle: Tank Destroyer + .faction-3-name = England + .faction-3-description = + England + Special Infantry: Sniper + .faction-4-name = France + .faction-4-description = + France + Special Building: Grand Cannon + .faction-5-name = Korea + .faction-5-description = + Korea + Special Aircraft: Black Eagle + .faction-6-name = Cuba + .faction-6-description = + Cuba + Special Infantry: Terrorist + .faction-7-name = Libya + .faction-7-description = + Libya + Special Vehicle: Demolition Truck + .faction-8-name = Iraq + .faction-8-description = + Iraq + Special Infantry: Desolator + .faction-9-name = Russia + .faction-9-description = + Russia + Special Vehicle: Tesla Tank diff --git a/mods/ra2/rules/ai.yaml b/mods/ra2/rules/ai.yaml index 9027d99e9..baccedc35 100644 --- a/mods/ra2/rules/ai.yaml +++ b/mods/ra2/rules/ai.yaml @@ -1,6 +1,6 @@ Player: ModularBot@testai: - Name: Test AI + Name: actor-player-modularbot-testai-name Type: test GrantConditionOnBotOwner@test: Condition: enable-test-ai diff --git a/mods/ra2/rules/aircraft.yaml b/mods/ra2/rules/aircraft.yaml index 6266861ac..3d48c5c71 100644 --- a/mods/ra2/rules/aircraft.yaml +++ b/mods/ra2/rules/aircraft.yaml @@ -3,7 +3,7 @@ shad: Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Inherits@MC: ^MindControllable Tooltip: - Name: Night Hawk + Name: actor-shad.name Selectable: Bounds: 1689, 2896, 0, -965 Health: @@ -21,7 +21,7 @@ shad: Queue: Vehicle BuildPaletteOrder: 90 Prerequisites: ~gaweap - Description: Infantry Transport Helicopter\nUndetectable by radar.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-shad.description Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -68,7 +68,7 @@ shad: shadhusk: Inherits: ^HelicopterHusk Tooltip: - Name: Night Hawk + Name: actor-shadhusk-name Aircraft: TurnSpeed: 40 Speed: 140 @@ -90,7 +90,7 @@ zep: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Kirov Airship + Name: actor-zep-name Buildable: Queue: Vehicle BuildPaletteOrder: 90 @@ -144,7 +144,7 @@ zep: zephusk: Inherits: ^HelicopterHusk Tooltip: - Name: Kirov Airship + Name: actor-zephusk-name Aircraft: TurnSpeed: 20 Speed: 25 @@ -166,12 +166,12 @@ orca: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Harrier + Name: actor-orca.name Buildable: Queue: Aircraft BuildPaletteOrder: 10 Prerequisites: ~aircraft.harrier - Description: Fast assault fighter\n Strong vs Buildings, Vehicles\n Weak vs Infantry, Aircraft + Description: actor-orca.description Aircraft: TurnSpeed: 12 Speed: 210 @@ -215,7 +215,7 @@ orca: orcahusk: Inherits: ^PlaneHusk Tooltip: - Name: Harrier + Name: actor-orcahusk-name Aircraft: TurnSpeed: 20 Speed: 210 @@ -225,7 +225,7 @@ orcahusk: beag: Inherits: orca Tooltip: - Name: Black Eagle + Name: actor-beag-name Buildable: BuildPaletteOrder: 20 Prerequisites: ~aircraft.korea @@ -246,7 +246,7 @@ beag: beaghusk: Inherits: ^PlaneHusk Tooltip: - Name: Black Eagle + Name: actor-beaghusk-name Aircraft: TurnSpeed: 20 Speed: 210 @@ -262,7 +262,7 @@ pdplane: Bounds: 2413, 3861 RejectsOrders: Tooltip: - Name: Cargo Plane + Name: actor-pdplane-name Aircraft: Repulsable: false CruiseAltitude: 5600 @@ -286,7 +286,7 @@ pdplane: pdplanehusk: Inherits: ^PlaneHusk Tooltip: - Name: Cargo Plane + Name: actor-pdplanehusk-name Aircraft: TurnSpeed: 20 Speed: 100 @@ -302,7 +302,7 @@ hornet: GainsExperience: ExperienceModifier: 500 Tooltip: - Name: Hornet + Name: actor-hornet-name Interactable: Bounds: 362, 579 Health: @@ -349,7 +349,7 @@ hornet: hornethusk: Inherits: ^PlaneHusk Tooltip: - Name: Hornet + Name: actor-hornethusk-name Aircraft: TurnSpeed: 20 Speed: 180 @@ -368,7 +368,7 @@ asw: GainsExperience: ExperienceModifier: 500 Tooltip: - Name: Osprey + Name: actor-asw-name Health: HP: 135 Armor: @@ -420,9 +420,9 @@ asw: aswhusk: Inherits: ^PlaneHusk Tooltip: - Name: Osprey + Name: actor-aswhusk.name Tooltip@NoRow: - Name: Osprey + Name: actor-aswhusk.norow--name Aircraft: TurnSpeed: 20 Speed: 180 diff --git a/mods/ra2/rules/allied-infantry.yaml b/mods/ra2/rules/allied-infantry.yaml index 423d55d49..362560604 100644 --- a/mods/ra2/rules/allied-infantry.yaml +++ b/mods/ra2/rules/allied-infantry.yaml @@ -5,7 +5,7 @@ engineer: Queue: Infantry Prerequisites: ~barracks BuildPaletteOrder: 30 - Description: Captures enemy structures.\n Unarmed + Description: actor-engineer.description Valued: Cost: 500 UpdatesPlayerStatistics: @@ -15,7 +15,7 @@ engineer: PlayerExperience: 25 Voice: Move Tooltip: - Name: Engineer + Name: actor-engineer.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -47,7 +47,7 @@ dog: Queue: Infantry Prerequisites: ~barracks BuildPaletteOrder: 40 - Description: Anti-infantry unit.\nCan detect cloaked units and spies.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-dog.description Valued: Cost: 200 UpdatesPlayerStatistics: @@ -57,7 +57,7 @@ dog: PlayerExperience: 10 Voice: Move Tooltip: - Name: Attack Dog + Name: actor-dog.name Selectable: Bounds: 724, 1158, 0, -241 Health: @@ -130,7 +130,7 @@ e1: Queue: Infantry Prerequisites: ~gapile BuildPaletteOrder: 10 - Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-e1.description Valued: Cost: 200 UpdatesPlayerStatistics: @@ -140,7 +140,7 @@ e1: PlayerExperience: 10 Voice: Move Tooltip: - Name: G.I. + Name: actor-e1.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -232,12 +232,12 @@ snipe: PlayerExperience: 30 Voice: Move Tooltip: - Name: Sniper + Name: actor-snipe.name Buildable: Queue: Infantry BuildPaletteOrder: 80 Prerequisites: radar, ~infantry.england - Description: Special anti-infantry unit.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-snipe.description Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -271,7 +271,7 @@ spy: BuildAtProductionType: Infantry BuildPaletteOrder: 130 Prerequisites: gatech, ~gapile - Description: Infiltrates enemy structures for intel or\nsabotage. Exact effect depends on the\nbuilding infiltrated.\n Unarmed\nSpecial Ability: Disguises + Description: actor-spy.description Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -281,8 +281,8 @@ spy: PlayerExperience: 25 Voice: Move DisguiseTooltip: - Name: Spy - GenericName: Soldier + Name: actor-spy.disguisetooltip-name + GenericName: actor-spy.disguisetooltip-generic-name Selectable: Bounds: 579, 1351, -24, -386 Health: @@ -326,7 +326,7 @@ ghost: BuildAtProductionType: Infantry BuildPaletteOrder: 100 Prerequisites: ~disabled - Description: Elite commando infantry, armed with\na sub machine gun and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles, Aircraft\nSpecial Ability: Destroy Building with C4 + Description: actor-ghost.description Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -336,7 +336,7 @@ ghost: PlayerExperience: 50 Voice: Move Tooltip: - Name: Navy SEAL + Name: actor-ghost.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -378,9 +378,9 @@ ccomand: Buildable: BuildPaletteOrder: 170 Prerequisites: ~gapile, ~allies.tech.infiltrated - Description: Elite commando infantry, armed with\na sub machine gun and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles, Aircraft\nSpecial Ability: Destroy Building with C4 + Description: actor-ccomand.description Tooltip: - Name: Chrono Commando + Name: actor-ccomand.name Valued: Cost: 2000 UpdatesPlayerStatistics: @@ -424,7 +424,7 @@ ptroop: Buildable: BuildPaletteOrder: 180 Prerequisites: ~gapile, ~soviets.tech.infiltrated - Description: Psychic infantry. Can mind control enemy units.\n Strong vs Infantry, Vehicles, Buildings\n Weak vs Dogs, Terror Drones, Aircraft\nSpecial Ability: Destroy Building with C4 + Description: actor-ptroop.description Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -433,7 +433,7 @@ ptroop: Payload: 500 PlayerExperience: 50 Tooltip: - Name: Psi Commando + Name: actor-ptroop.name -PortableChrono: Armament@primary: Weapon: MindControl @@ -475,7 +475,7 @@ tany: BuildPaletteOrder: 140 Prerequisites: gatech, ~gapile BuildLimit: 1 - Description: Elite commando infantry, armed with \ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles, Aircraft\nSpecial Ability: Destroy Building with C4\n\nMaximum 1 can be trained. + Description: actor-tany.description Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -485,7 +485,7 @@ tany: PlayerExperience: 50 Voice: Move Tooltip: - Name: Tanya + Name: actor-tany.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -532,13 +532,13 @@ jumpjet: BuildAtProductionType: Infantry BuildPaletteOrder: 60 Prerequisites: ~gapile, radar - Description: Airborne soldier.\n Strong vs Infantry, Aircraft\n Weak vs Vehicles + Description: actor-jumpjet.description Valued: Cost: 600 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Rocketeer + Name: actor-jumpjet.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -615,7 +615,7 @@ jumpjet.husk: -RenderVoxels: -WithVoxelBody: Tooltip: - Name: Rocketeer + Name: actor-jumpjet-husk-name Aircraft: TurnSpeed: 40 Speed: 140 @@ -632,13 +632,13 @@ cleg: Selectable: Bounds: 482, 1448, 0, -530 Tooltip: - Name: Chrono Legionnaire + Name: actor-cleg.name Buildable: Queue: Infantry BuildAtProductionType: Infantry BuildPaletteOrder: 150 Prerequisites: ~gapile, gatech - Description: High-tech soldier.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-cleg.description ProducibleWithLevel: Prerequisites: barracks.infiltrated Valued: diff --git a/mods/ra2/rules/allied-naval.yaml b/mods/ra2/rules/allied-naval.yaml index d8dac5d05..679976446 100644 --- a/mods/ra2/rules/allied-naval.yaml +++ b/mods/ra2/rules/allied-naval.yaml @@ -5,13 +5,13 @@ lcrf: Queue: Ship BuildPaletteOrder: 10 Prerequisites: ~gayard - Description: General-purpose naval transport.\nCan carry infantry and vehicles.\n Unarmed + Description: actor-lcrf.description Valued: Cost: 900 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Amphibious Transport + Name: actor-lcrf.name Selectable: Bounds: 1448, 3861, 0, -289 Health: @@ -58,13 +58,13 @@ dest: Queue: Ship BuildPaletteOrder: 20 Prerequisites: ~gayard - Description: Allied Main Battle Ship armed with cannons and\n an Osprey helicopter.\nCan detect submarines and sea animals.\n Strong vs Naval units\n Weak vs Ground units, Aircraft + Description: actor-dest.description Valued: Cost: 1000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Destroyer + Name: actor-dest.name Health: HP: 600 Armor: @@ -136,13 +136,13 @@ aegis: Queue: Ship BuildPaletteOrder: 30 Prerequisites: radar, ~gayard - Description: Anti-Air naval unit.\n Strong vs Aircraft\n Grounds units, Ships + Description: actor-aegis.description Valued: Cost: 1200 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Aegis Cruiser + Name: actor-aegis.name Selectable: Bounds: 1448, 3861, 0, -289 Health: @@ -179,13 +179,13 @@ dlph: Queue: Ship BuildPaletteOrder: 40 Prerequisites: gatech, ~gayard - Description: Trained dolphin\narmed with sonic beams.\n Strong vs Ships + Description: actor-dlph.description Valued: Cost: 500 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Dolphin + Name: actor-dlph.name Armor: Type: Light Health: @@ -263,13 +263,13 @@ carrier: Queue: Ship BuildPaletteOrder: 60 Prerequisites: gatech, ~gayard - Description: Aircraft carrier ship.\n Strong vs Tanks, Structures\n Weak vs Infantry + Description: actor-carrier.description Valued: Cost: 2000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Aircraft Carrier + Name: actor-carrier.name Health: HP: 800 Armor: diff --git a/mods/ra2/rules/allied-structures.yaml b/mods/ra2/rules/allied-structures.yaml index 5ebcab9b9..236c6e16d 100644 --- a/mods/ra2/rules/allied-structures.yaml +++ b/mods/ra2/rules/allied-structures.yaml @@ -5,7 +5,7 @@ gacnst: Queue: Building BuildPaletteOrder: 1000 Prerequisites: ~disabled - Description: Builds base structures. + Description: actor-gacnst.description Building: Footprint: xxxx xxxx xxxx xxxx Dimensions: 4,4 @@ -22,7 +22,7 @@ gacnst: Production: Produces: Building,Support Tooltip: - Name: Construction Yard + Name: actor-gacnst.name BaseBuilding: BaseProvider: Range: 0 @@ -89,13 +89,13 @@ gapowr: Queue: Building BuildPaletteOrder: 10 Prerequisites: ~structures.allies - Description: Provides power for other structures. + Description: actor-gapowr.description IsometricSelectable: Height: 60 Valued: Cost: 800 Tooltip: - Name: Power Plant + Name: actor-gapowr.name ProvidesPrerequisite: Prerequisite: power Building: @@ -136,13 +136,13 @@ gapile: Queue: Building BuildPaletteOrder: 20 Prerequisites: power, ~structures.allies - Description: Trains infantry. + Description: actor-gapile.description IsometricSelectable: Height: 60 Valued: Cost: 500 Tooltip: - Name: Barracks + Name: actor-gapile.name ProvidesPrerequisite: Prerequisite: barracks ProvidesPrerequisite@england: @@ -212,13 +212,13 @@ garefn: Queue: Building BuildPaletteOrder: 30 Prerequisites: power, ~structures.allies - Description: Processes ore into credits. + Description: actor-garefn.description IsometricSelectable: Height: 60 Valued: Cost: 2000 Tooltip: - Name: Ore Refinery + Name: actor-garefn.name ProvidesPrerequisite: Prerequisite: refinery ProvidesPrerequisite@default: @@ -275,11 +275,11 @@ gaairc: Queue: Building BuildPaletteOrder: 60 Prerequisites: garefn, ~structures.allies, ~!structures.america - Description: Provides radar\nSupports 4 aircraft. + Description: actor-gaairc.description Valued: Cost: 1000 Tooltip: - Name: Airforce Command Headquarters + Name: actor-gaairc.name ProvidesPrerequisite: Prerequisite: radar ProvidesPrerequisite@allies: @@ -363,7 +363,7 @@ gaairc: amradr: Inherits: gaairc Tooltip: - Name: American Airforce Command Headquarters + Name: actor-amradr.name Buildable: Prerequisites: garefn, ~structures.america WithSpriteBody: @@ -377,8 +377,8 @@ amradr: OrderName: AmericanParatroopers Icon: airborne ChargeInterval: 9000 - Name: American Paratroopers - Description: A Cargo Plane drops eight GIs\nanywhere on the map. + Name: actor-amradr.paratrooperspower-paratroopers-name + Description: actor-amradr.paratrooperspower-paratroopers-description DropItems: e1,e1,e1,e1,e1,e1,e1,e1 QuantizedFacings: 8 UnitType: pdplane @@ -392,13 +392,13 @@ gaweap: Queue: Building BuildPaletteOrder: 40 Prerequisites: garefn, gapile, ~structures.allies - Description: Produces vehicles. + Description: actor-gaweap.description IsometricSelectable: Height: 60 Valued: Cost: 2000 Tooltip: - Name: War Factory + Name: actor-gaweap.name ProvidesPrerequisite@germany: Prerequisite: vehicles.germany Factions: germany @@ -484,12 +484,12 @@ gayard: Valued: Cost: 1000 Tooltip: - Name: Naval Yard + Name: actor-gayard.name Buildable: Queue: Building BuildPaletteOrder: 50 Prerequisites: power, refinery, ~structures.allies - Description: Produces and repairs ships,\nsubmarines, transports, and other naval units. + Description: actor-gayard.description Targetable: TargetTypes: Ground, Water, C4 ProvidesPrerequisite@default: @@ -619,13 +619,13 @@ gadept: Queue: Building BuildPaletteOrder: 70 Prerequisites: gaweap, ~structures.allies - Description: Repairs vehicles and removes Terror Drones (for a price). + Description: actor-gadept.description IsometricSelectable: Height: 45 Valued: Cost: 800 Tooltip: - Name: Service Depot + Name: actor-gadept.name ProvidesPrerequisite@default: Building: Footprint: x== x== x== @@ -671,13 +671,13 @@ gatech: Queue: Building BuildPaletteOrder: 80 Prerequisites: radar, gaweap, ~structures.allies - Description: Allows deployment of advanced units. + Description: actor-gatech.description IsometricSelectable: Height: 180 Valued: Cost: 2000 Tooltip: - Name: Battle Lab + Name: actor-gatech.name ProvidesPrerequisite@default: Building: Footprint: xx xx xx @@ -710,9 +710,9 @@ gawall: Queue: Support BuildPaletteOrder: 10 Prerequisites: barracks, ~structures.allies - Description: Light wall.\nCrushable by vehicles. + Description: actor-gawall.description Tooltip: - Name: Allied Wall + Name: actor-gawall.name gapill: Inherits: ^SupportBuilding @@ -721,11 +721,11 @@ gapill: Queue: Support BuildPaletteOrder: 20 Prerequisites: barracks, ~structures.allies - Description: Automated anti-infantry defense. + Description: actor-gapill.description Valued: Cost: 500 Tooltip: - Name: Pill Box + Name: actor-gapill.name Building: Footprint: x Dimensions: 1, 1 @@ -763,11 +763,11 @@ nasam: Queue: Support BuildPaletteOrder: 30 Prerequisites: barracks, ~structures.allies - Description: Automated anti-aircraft defense. + Description: actor-nasam.description Valued: Cost: 1000 Tooltip: - Name: Patriot Missile System + Name: actor-nasam.name Building: Footprint: x Dimensions: 1, 1 @@ -816,11 +816,11 @@ gtgcan: Queue: Support BuildPaletteOrder: 50 Prerequisites: radar, ~structures.france - Description: Automated, long ranged anti-ground defense. + Description: actor-gtgcan.description Valued: Cost: 2000 Tooltip: - Name: Grand Cannon + Name: actor-gtgcan.name Building: Footprint: xx xx Dimensions: 2, 2 @@ -873,13 +873,13 @@ gaorep: BuildPaletteOrder: 100 Prerequisites: garefn, gatech, ~structures.allies BuildLimit: 1 - Description: Refines all forms of income by 25%. + Description: actor-gaorep.description IsometricSelectable: Height: 60 Valued: Cost: 2500 Tooltip: - Name: Ore Purifier + Name: actor-gaorep.name Building: Footprint: xxx xxx xxx Dimensions: 3,3 @@ -907,13 +907,13 @@ gaspysat: Queue: Support BuildPaletteOrder: 70 Prerequisites: gatech, ~structures.allies - Description: Reveals the entire battlefield. + Description: actor-gaspysat.description IsometricSelectable: Height: 75 Valued: Cost: 1500 Tooltip: - Name: Spy Satellite Uplink + Name: actor-gaspysat.name Building: Footprint: xx xx Dimensions: 2,2 @@ -946,12 +946,12 @@ gagap: Valued: Cost: 1000 Tooltip: - Name: Gap Generator + Name: actor-gagap.name Buildable: Queue: Support BuildPaletteOrder: 60 Prerequisites: gatech, ~structures.allies - Description: Obscures the enemy's view with shroud.\nRequires power to operate. + Description: actor-gagap.description IsometricSelectable: Height: 90 GrantConditionOnPowerState@LOWPOWER: @@ -981,13 +981,13 @@ gaweat: BuildPaletteOrder: 90 Prerequisites: gatech, ~structures.allies, ~techlevel.unrestricted BuildLimit: 1 - Description: Play God with deadly weather! + Description: actor-gaweat.description IsometricSelectable: Height: 75 Valued: Cost: 5000 Tooltip: - Name: Weather Controller + Name: actor-gaweat.name Building: Footprint: xxx xxx xxx Dimensions: 3,3 @@ -1011,8 +1011,8 @@ gaweat: OrderName: WeatherControlDevice ChargeInterval: 15000 Icon: lightningstorm - Name: Weather Storm - Description: Control the weather to destroy enemy forces. + Name: actor-gaweat.weathercontrolsupportpower-lightningstorm-name + Description: actor-gaweat.weathercontrolsupportpower-lightningstorm-description InsufficientPowerSpeechNotification: WeathercontrolDeviceOffline EndChargeSpeechNotification: LightningStormReady SelectTargetSpeechNotification: SelectTarget @@ -1037,14 +1037,14 @@ gacsph: Queue: Support BuildPaletteOrder: 80 Prerequisites: gatech, ~structures.allies, ~techlevel.unrestricted - Description: Allows teleporting units in a 3x3 array. + Description: actor-gacsph.description BuildLimit: 1 IsometricSelectable: Height: 45 Valued: Cost: 2500 Tooltip: - Name: Chronosphere + Name: actor-gacsph.name Building: Footprint: xxx xxx xxx xxx Dimensions: 4,3 @@ -1071,8 +1071,8 @@ gacsph: OrderName: Chronoshift Icon: chrono ChargeInterval: 7500 - Name: Chronosphere - Description: Teleports a group of units across\nthe map. + Name: actor-gacsph.chronoshiftpower-chronoshift-name + Description: actor-gacsph.chronoshiftpower-chronoshift-description # Those sounds don't work: OpenRA/OpenRA#10540 # They also want to be played successive #SelectTargetSound: schrlo1.wav, schrlo2a.wav schrlo2b.wav, schrlo2c.wav, schrlo3.wav @@ -1098,11 +1098,11 @@ atesla: Queue: Support BuildPaletteOrder: 40 Prerequisites: power, radar, ~structures.allies - Description: Advanced base defense.\nRequires power to operate.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-atesla.description Valued: Cost: 1500 Tooltip: - Name: Prism Tower + Name: actor-atesla.name Building: Footprint: x Dimensions: 1, 1 @@ -1144,28 +1144,28 @@ power: AlwaysVisible: Interactable: Tooltip: - Name: Power Plant + Name: actor-power-name refinery: AlwaysVisible: Interactable: Tooltip: - Name: Ore Refinery + Name: actor-refinery-name barracks: AlwaysVisible: Interactable: Tooltip: - Name: Infantry Production + Name: actor-barracks-name radar: AlwaysVisible: Interactable: Tooltip: - Name: Radar + Name: actor-radar-name repairpad: AlwaysVisible: Interactable: Tooltip: - Name: Service Depot + Name: actor-repairpad-name diff --git a/mods/ra2/rules/allied-vehicles.yaml b/mods/ra2/rules/allied-vehicles.yaml index ed4967b0a..aaa429784 100644 --- a/mods/ra2/rules/allied-vehicles.yaml +++ b/mods/ra2/rules/allied-vehicles.yaml @@ -5,11 +5,11 @@ amcv: Queue: Vehicle BuildPaletteOrder: 80 Prerequisites: ~gaweap, gadept - Description: Deploys into a Construction Yard. + Description: actor-amcv.description Valued: Cost: 3000 Tooltip: - Name: Mobile Construction Vehicle + Name: actor-amcv.name Selectable: Priority: 4 Bounds: 1641, 2702, 0, -337 @@ -46,13 +46,13 @@ cmin: Queue: Vehicle BuildPaletteOrder: 10 Prerequisites: ~gaweap, refinery - Description: Gathers Ore.\n Unarmed\nSpecial ability: Can teleport to own refineries + Description: actor-cmin.description Valued: Cost: 1400 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Chrono Miner + Name: actor-cmin.name Selectable: Priority: 7 Bounds: 1544, 2509, 0, -289 @@ -112,12 +112,12 @@ mtnk: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Grizzly Battle Tank + Name: actor-mtnk.name Buildable: Queue: Vehicle BuildPaletteOrder: 20 Prerequisites: ~gaweap - Description: Allied Main Battle Tank.\n Strong vs Vehicles, Ships\n Weak vs Infantry, Aircraft + Description: actor-mtnk.description Mobile: Speed: 105 TurnSpeed: 20 @@ -164,14 +164,14 @@ tnkd: Valued: Cost: 900 Tooltip: - Name: Tank Destroyer + Name: actor-tnkd.name UpdatesPlayerStatistics: AddToArmyValue: true Buildable: Queue: Vehicle BuildPaletteOrder: 40 Prerequisites: ~vehicles.germany - Description: Special anti-armor unit.\n Strong vs Vehicles, Ships\n Weak vs Infantry, Aircraft + Description: actor-tnkd.description Mobile: Speed: 75 TurnSpeed: 20 @@ -218,12 +218,12 @@ fv: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Infantry Fighting Vehicle + Name: actor-fv.name Buildable: Queue: Vehicle BuildPaletteOrder: 30 Prerequisites: ~gaweap - Description: Multi-Purpose Vehicle.\nWithout passenger:\n Strong vs Infantry, Aircraft\n Weak vs Vehicles, Ships\nSpecial Ability: Armament depends on passenger. + Description: actor-fv.description Mobile: Speed: 150 TurnSpeed: 20 @@ -368,13 +368,13 @@ sref: Queue: Vehicle BuildPaletteOrder: 50 Prerequisites: gatech, ~gaweap - Description: Fires deadly beams of light.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-sref.description Valued: Cost: 1200 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Prism Tank + Name: actor-sref.name Selectable: Bounds: 1544, 2509, 0, -482 Health: @@ -441,17 +441,17 @@ mgtk: Queue: Vehicle BuildPaletteOrder: 70 Prerequisites: gatech, ~gaweap - Description: As tree disguised tank.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-mgtk.description Valued: Cost: 1000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Mirage Tank + Name: actor-mgtk.name RequiresCondition: !tree MirageTooltip@Tree: - Name: Mirage Tank - GenericName: Tree + Name: actor-mgtk.miragetooltip-tree-name + GenericName: actor-mgtk.miragetooltip-tree-generic-name GenericVisibility: Enemy, Neutral RequiresCondition: tree Mirage: diff --git a/mods/ra2/rules/animals.yaml b/mods/ra2/rules/animals.yaml index b96ace211..d0734652d 100644 --- a/mods/ra2/rules/animals.yaml +++ b/mods/ra2/rules/animals.yaml @@ -1,7 +1,7 @@ cow: Inherits: ^Animal Tooltip: - Name: Cow + Name: actor-cow-name Health: HP: 150 RevealsShroud: @@ -20,7 +20,7 @@ all: Inherits: ^Animal Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Tooltip: - Name: Alligator + Name: actor-all-name Voiced: VoiceSet: AlligatorVoice Armament: @@ -30,7 +30,7 @@ polarb: Inherits: ^Animal Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Tooltip: - Name: Polar Bear + Name: actor-polarb-name Voiced: VoiceSet: BearVoice Armament: @@ -40,7 +40,7 @@ josh: Inherits: ^Animal Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove Tooltip: - Name: Monkey + Name: actor-josh-name Voiced: VoiceSet: ChimpanzeeVoice Armament: diff --git a/mods/ra2/rules/bridges.yaml b/mods/ra2/rules/bridges.yaml index c14b13341..0075a146a 100644 --- a/mods/ra2/rules/bridges.yaml +++ b/mods/ra2/rules/bridges.yaml @@ -4,7 +4,7 @@ cabhut: FrozenUnderFog: WithSpriteBody: Tooltip: - Name: Bridge Repair Hut + Name: actor-cabhut-name Building: Footprint: x Dimensions: 1, 1 @@ -30,7 +30,7 @@ cabhut: UseClassicPerspectiveFudge: false QuantizedFacings: 1 Tooltip: - Name: Wooden Bridge + Name: meta-lowbridgeramp-name MapEditorData: Categories: Bridge Interactable: @@ -49,7 +49,7 @@ cabhut: lobrdb_a: Inherits: ^LowBridge Tooltip: - Name: Concrete Bridge + Name: actor-lobrdb-a-name Building: Footprint: ___ Dimensions: 3, 1 @@ -72,7 +72,7 @@ lobrdb_a: lobrdb_a_d: Inherits: lobrdb_a EditorOnlyTooltip: - Name: Dead Bridge + Name: actor-lobrdb-a-d-name -GroundLevelBridge: -AppearsOnRadar: BridgePlaceholder: @@ -93,7 +93,7 @@ lobrdb_a_d: lobrdb_b: Inherits: ^LowBridge Tooltip: - Name: Concrete Bridge + Name: actor-lobrdb-b-name Building: Footprint: _ _ _ Dimensions: 1, 3 @@ -116,7 +116,7 @@ lobrdb_b: lobrdb_b_d: Inherits: lobrdb_b EditorOnlyTooltip: - Name: Dead Bridge + Name: actor-lobrdb-b-d-name -GroundLevelBridge: -AppearsOnRadar: BridgePlaceholder: @@ -142,7 +142,7 @@ lobrdb_r_se: BridgePlaceholder: NeighbourOffsets: -1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdb-r-se-name lobrdb_r_nw: Inherits: ^LowBridgeRamp @@ -152,7 +152,7 @@ lobrdb_r_nw: BridgePlaceholder: NeighbourOffsets: 1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdb-r-nw-name lobrdb_r_ne: Inherits: ^LowBridgeRamp @@ -162,7 +162,7 @@ lobrdb_r_ne: BridgePlaceholder: NeighbourOffsets: 1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdb-r-ne-name lobrdb_r_sw: Inherits: ^LowBridgeRamp @@ -172,7 +172,7 @@ lobrdb_r_sw: BridgePlaceholder: NeighbourOffsets: 1,-1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdb-r-sw-name lobrdg_a: Inherits: ^LowBridge @@ -198,7 +198,7 @@ lobrdg_a: lobrdg_a_d: Inherits: lobrdg_a EditorOnlyTooltip: - Name: Dead Bridge + Name: actor-lobrdg-a-d-name -GroundLevelBridge: -AppearsOnRadar: BridgePlaceholder: @@ -240,7 +240,7 @@ lobrdg_b: lobrdg_b_d: Inherits: lobrdg_b EditorOnlyTooltip: - Name: Dead Bridge + Name: actor-lobrdg-b-d-name -GroundLevelBridge: -AppearsOnRadar: BridgePlaceholder: @@ -266,7 +266,7 @@ lobrdg_r_se: BridgePlaceholder: NeighbourOffsets: -1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdg-r-se-name lobrdg_r_nw: Inherits: ^LowBridgeRamp @@ -276,7 +276,7 @@ lobrdg_r_nw: BridgePlaceholder: NeighbourOffsets: 1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdg-r-nw-name lobrdg_r_ne: Inherits: ^LowBridgeRamp @@ -286,7 +286,7 @@ lobrdg_r_ne: BridgePlaceholder: NeighbourOffsets: 1,1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdg-r-ne-name lobrdg_r_sw: Inherits: ^LowBridgeRamp @@ -296,7 +296,7 @@ lobrdg_r_sw: BridgePlaceholder: NeighbourOffsets: 1,-1 EditorOnlyTooltip: - Name: Bridge Ramp + Name: actor-lobrdg-r-sw-name ^ElevatedBridgePlaceholder: AlwaysVisible: @@ -312,7 +312,7 @@ lobrdg_r_sw: UseClassicPerspectiveFudge: false QuantizedFacings: 1 Tooltip: - Name: Concrete Bridge + Name: meta-elevatedbridgeplaceholder-name Immobile: OccupiesSpace: false MapEditorData: @@ -329,9 +329,9 @@ bridge2: bridgb1: Inherits: ^ElevatedBridgePlaceholder Tooltip: - Name: Wooden Bridge + Name: actor-bridgb1-name bridgb2: Inherits: ^ElevatedBridgePlaceholder Tooltip: - Name: Wooden Bridge + Name: actor-bridgb2-name diff --git a/mods/ra2/rules/civilian-naval.yaml b/mods/ra2/rules/civilian-naval.yaml index 5d8265982..28b29d683 100644 --- a/mods/ra2/rules/civilian-naval.yaml +++ b/mods/ra2/rules/civilian-naval.yaml @@ -4,7 +4,7 @@ tug: Valued: Cost: 500 Tooltip: - Name: Tug Boat + Name: actor-tug-name Mobile: TurnSpeed: 8 Speed: 60 @@ -29,7 +29,7 @@ cruise: Valued: Cost: 500 Tooltip: - Name: Cruise Ship + Name: actor-cruise-name Mobile: TurnSpeed: 4 Speed: 60 @@ -50,7 +50,7 @@ cdest: Inherits: dest -Buildable: Tooltip: - Name: Coast Guard Boat + Name: actor-cdest-name Armor: Type: Light -Voiced: diff --git a/mods/ra2/rules/civilian-props.yaml b/mods/ra2/rules/civilian-props.yaml index 2c1c9d115..ca50d24e6 100644 --- a/mods/ra2/rules/civilian-props.yaml +++ b/mods/ra2/rules/civilian-props.yaml @@ -1,7 +1,7 @@ camisc01: Inherits: ^CivBuilding Tooltip: - Name: Barrels + Name: actor-camisc01-name Health: HP: 5 Armor: @@ -16,7 +16,7 @@ camisc01: camisc02: Inherits: ^CivBuilding Tooltip: - Name: Barrel + Name: actor-camisc02-name Health: HP: 5 Armor: @@ -31,7 +31,7 @@ camisc02: camisc03: Inherits: ^CivBuilding Tooltip: - Name: Dumpster + Name: actor-camisc03-name Health: HP: 100 Armor: @@ -45,7 +45,7 @@ camisc03: camisc04: Inherits: ^CivBuilding Tooltip: - Name: Mailbox + Name: actor-camisc04-name Health: HP: 10 Armor: @@ -61,7 +61,7 @@ camisc04: camisc05: Inherits: ^CivBuilding Tooltip: - Name: Pipes + Name: actor-camisc05-name Health: HP: 10 Armor: @@ -81,7 +81,7 @@ camisc06: Footprint: xx Dimensions: 2, 1 Tooltip: - Name: V3 Ammunition + Name: actor-camisc06-name Health: HP: 10 Armor: @@ -97,7 +97,7 @@ camisc06: camsc11: Inherits: ^CivBuilding Tooltip: - Name: Tires + Name: actor-camsc11-name Health: HP: 10 Armor: @@ -110,7 +110,7 @@ camsc11: camsc12: Inherits: ^CivBuilding Tooltip: - Name: Practice Target + Name: actor-camsc12-name Health: HP: 10 Armor: @@ -125,7 +125,7 @@ camsc13: Footprint: x x Dimensions: 1, 2 Tooltip: - Name: Derelict Tank + Name: actor-camsc13-name Health: HP: 800 Armor: @@ -136,7 +136,7 @@ camsc13: ammocrat: Inherits: ^CivBuilding Tooltip: - Name: Ammo Crates + Name: actor-ammocrat-name Health: HP: 1 RenderSprites: @@ -147,7 +147,7 @@ ammocrat: camsc01: Inherits: ^CivBuilding Tooltip: - Name: Hot Dog Stand + Name: actor-camsc01-name RevealsShroud: Range: 6c0 Health: @@ -159,7 +159,7 @@ camsc01: camsc02: Inherits: ^CivBuilding Tooltip: - Name: Beach Umbrellas + Name: actor-camsc02-name RevealsShroud: Range: 6c0 Health: @@ -171,7 +171,7 @@ camsc02: camsc03: Inherits: ^CivBuilding Tooltip: - Name: Beach Umbrellas + Name: actor-camsc03-name RevealsShroud: Range: 6c0 Health: @@ -183,7 +183,7 @@ camsc03: camsc04: Inherits: ^CivBuilding Tooltip: - Name: Beach Towels + Name: actor-camsc04-name RevealsShroud: Range: 6c0 Health: @@ -197,7 +197,7 @@ camsc04: camsc05: Inherits: ^CivBuilding Tooltip: - Name: Beach Towels + Name: actor-camsc05-name RevealsShroud: Range: 6c0 Health: @@ -211,7 +211,7 @@ camsc05: camsc06: Inherits: ^CivBuilding Tooltip: - Name: Camp Fire + Name: actor-camsc06-name RevealsShroud: Range: 6c0 Health: @@ -227,7 +227,7 @@ caeuro05: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Statue + Name: actor-caeuro05-name Armor: Type: concrete RevealsShroud: @@ -245,7 +245,7 @@ caeuro05: capark01: Inherits: ^CivBuilding Tooltip: - Name: Park Bench + Name: actor-capark01-name RevealsShroud: Range: 6c0 Health: @@ -259,7 +259,7 @@ capark02: Inherits: ^CivBuilding Inherits@shape: ^2x1Shape Tooltip: - Name: Swing Set + Name: actor-capark02-name RevealsShroud: Range: 6c0 Health: @@ -274,7 +274,7 @@ capark03: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Merry Go Round + Name: actor-capark03-name RevealsShroud: Range: 6c0 Health: @@ -288,7 +288,7 @@ capark03: castrt01: Inherits: ^CivBuilding Tooltip: - Name: Traffic Light + Name: actor-castrt01-name Armor: Type: steel RevealsShroud: @@ -303,7 +303,7 @@ castrt01: castrt02: Inherits: ^CivBuilding Tooltip: - Name: Traffic Light + Name: actor-castrt02-name Armor: Type: steel RevealsShroud: @@ -318,7 +318,7 @@ castrt02: castrt03: Inherits: ^CivBuilding Tooltip: - Name: Traffic Light + Name: actor-castrt03-name Armor: Type: steel RevealsShroud: @@ -333,7 +333,7 @@ castrt03: castrt04: Inherits: ^CivBuilding Tooltip: - Name: Traffic Light + Name: actor-castrt04-name Armor: Type: steel RevealsShroud: @@ -348,7 +348,7 @@ castrt04: castrt05: Inherits: ^CivBuilding Tooltip: - Name: Bus Stop + Name: actor-castrt05-name Armor: Type: steel RevealsShroud: @@ -362,7 +362,7 @@ camov01: Inherits: ^CivBuilding Inherits@shape: ^1x4Shape Tooltip: - Name: Drive In Movie Screen + Name: actor-camov01-name Armor: Type: steel RevealsShroud: @@ -380,7 +380,7 @@ camov02: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Drive In Movie Concession Stand + Name: actor-camov02-name Armor: Type: steel RevealsShroud: @@ -397,17 +397,17 @@ camov02: pole01: Inherits: ^TelephonePole Tooltip: - Name: Utility Pole + Name: actor-pole01-name pole02: Inherits: ^TelephonePole Tooltip: - Name: Utility Pole + Name: actor-pole02-name hdstn01: Inherits: ^Tree Tooltip: - Name: AlringtonStones + Name: actor-hdstn01-name MapEditorData: Categories: Decoration -MirageTarget: @@ -475,7 +475,7 @@ sign06: spkr01: Inherits: ^Tree Tooltip: - Name: Drive-In Speaker + Name: actor-spkr01-name MapEditorData: Categories: Decoration -MirageTarget: @@ -532,7 +532,7 @@ carus07: cakrmw: Inherits: ^Wall Tooltip: - Name: Kremlin Walls + Name: actor-cakrmw-name Armor: Type: Concrete @@ -552,7 +552,7 @@ gagate_a: -WithSpriteBody: WithGateSpriteBody: Tooltip: - Name: Guard Border Crossing + Name: actor-gagate-a-name Building: Dimensions: 3,1 Footprint: xxx diff --git a/mods/ra2/rules/civilian-structures.yaml b/mods/ra2/rules/civilian-structures.yaml index a8f9fe180..3acf920a8 100644 --- a/mods/ra2/rules/civilian-structures.yaml +++ b/mods/ra2/rules/civilian-structures.yaml @@ -1,17 +1,17 @@ cafncb: Inherits: ^Fence Tooltip: - Name: Black Fence + Name: actor-cafncb-name cafncw: Inherits: ^Fence Tooltip: - Name: White Fence + Name: actor-cafncw-name gasand: Inherits: ^Fence Tooltip: - Name: Sandbags + Name: actor-gasand-name SoundOnDamageTransition: DamagedSounds: gsancrua.wav, gsancrub.wav DestroyedSounds: gsancrua.wav, gsancrub.wav @@ -19,7 +19,7 @@ gasand: cafncp: Inherits: ^Fence Tooltip: - Name: Prison Camp Fence + Name: actor-cafncp-name cahse01: Inherits: ^CivBuilding @@ -194,7 +194,7 @@ cahse07.rubble: cawt01: Inherits: ^CivBuilding Tooltip: - Name: Water Tower + Name: actor-cawt01-name Armor: Type: Steel RevealsShroud: @@ -208,7 +208,7 @@ cats01: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Twin Silos + Name: actor-cats01-name Armor: Type: Steel RevealsShroud: @@ -225,7 +225,7 @@ cabarn02: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Barn + Name: actor-cabarn02-name RevealsShroud: Range: 6c0 Health: @@ -243,7 +243,7 @@ cawash01: Footprint: xxxx xxxx xxxx xxxx Dimensions: 4, 4 Tooltip: - Name: White House + Name: actor-cawash01-name Health: HP: 1000 Armor: @@ -521,7 +521,7 @@ cawsh12: Footprint: xxx xxx xxx Dimensions: 3, 3 Tooltip: - Name: Washington Monument + Name: actor-cawsh12-name Health: HP: 1000 Armor: @@ -598,7 +598,7 @@ cawash14: Inherits: ^CivBuilding Inherits@shape: ^3x3Shape Tooltip: - Name: Jefferson Memorial + Name: actor-cawash14-name Armor: Type: Concrete Health: @@ -626,7 +626,7 @@ cawash15: Inherits: ^CivBuilding Inherits@shape: ^3x4Shape Tooltip: - Name: Lincoln Memorial + Name: actor-cawash15-name Armor: Type: Concrete Health: @@ -654,7 +654,7 @@ cawash16: Inherits: ^CivBuilding Inherits@shape: ^5x3Shape Tooltip: - Name: Smithsonian Castle + Name: actor-cawash16-name Armor: Type: Concrete RevealsShroud: @@ -684,7 +684,7 @@ cawash17: Inherits: ^CivBuilding Inherits@shape: ^6x4Shape Tooltip: - Name: Smithsonian Natural History Museum + Name: actor-cawash17-name Armor: Type: Concrete RevealsShroud: @@ -714,7 +714,7 @@ cawash18: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: White House Fountain + Name: actor-cawash18-name Armor: Type: Concrete RevealsShroud: @@ -735,7 +735,7 @@ cawash19: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Iwo Jima Memorial + Name: actor-cawash19-name Armor: Type: Concrete RevealsShroud: @@ -795,7 +795,7 @@ canewy04: Inherits: ^CivBuilding Inherits@shape: ^3x3Shape Tooltip: - Name: Statue of Liberty + Name: actor-canewy04-name Armor: Type: Concrete RevealsShroud: @@ -827,7 +827,7 @@ canewy05: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: World Trade Center + Name: actor-canewy05-name Armor: Type: Concrete RevealsShroud: @@ -1182,7 +1182,7 @@ canewy20: Inherits: ^CivBuilding Inherits@shape: ^3x5Shape Tooltip: - Name: Warehouse + Name: actor-canewy20-name Armor: Type: Steel RevealsShroud: @@ -1210,7 +1210,7 @@ canewy21: Inherits: ^CivBuilding Inherits@shape: ^5x3Shape Tooltip: - Name: Warehouse + Name: actor-canewy21-name Armor: Type: Steel RevealsShroud: @@ -1238,7 +1238,7 @@ caswst01: Inherits: ^CivBuilding Inherits@shape: ^2x3Shape Tooltip: - Name: Southwest Building + Name: actor-caswst01-name Armor: Type: Steel RevealsShroud: @@ -1271,7 +1271,7 @@ caarmy01: Footprint: xxx xxx Dimensions: 3, 2 Tooltip: - Name: Army Tent + Name: actor-caarmy01-name Health: HP: 200 RevealsShroud: @@ -1280,7 +1280,7 @@ caarmy01: caarmy02: Inherits: ^CivBuilding Tooltip: - Name: Army Tent + Name: actor-caarmy02-name RevealsShroud: Range: 6c0 Health: @@ -1289,7 +1289,7 @@ caarmy02: caarmy03: Inherits: ^CivBuilding Tooltip: - Name: Army Tent + Name: actor-caarmy03-name RevealsShroud: Range: 6c0 Health: @@ -1298,7 +1298,7 @@ caarmy03: caarmy04: Inherits: ^CivBuilding Tooltip: - Name: Army Tent + Name: actor-caarmy04-name RevealsShroud: Range: 6c0 Health: @@ -1423,7 +1423,7 @@ cafarm01: Footprint: xx xx Dimensions: 2, 2 Tooltip: - Name: Farm + Name: actor-cafarm01-name Health: HP: 400 RevealsShroud: @@ -1437,7 +1437,7 @@ cafarm02: Footprint: x Dimensions: 1, 1 Tooltip: - Name: Farm Silo + Name: actor-cafarm02-name Health: HP: 400 SpawnActorOnDeath: @@ -1454,7 +1454,7 @@ cafarm06: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Lighthouse + Name: actor-cafarm06-name Armor: Type: Steel RevealsShroud: @@ -1481,52 +1481,52 @@ cafarm06.rubble: causfgl: Inherits: ^Flag Tooltip: - Name: US Flag + Name: actor-causfgl-name carufgl: Inherits: ^Flag Tooltip: - Name: Russian Flag + Name: actor-carufgl-name cairfgl: Inherits: ^Flag Tooltip: - Name: Iraqi Flag + Name: actor-cairfgl-name capofgl: Inherits: ^Flag Tooltip: - Name: Polish Flag + Name: actor-capofgl-name caskfgl: Inherits: ^Flag Tooltip: - Name: South Korean Flag + Name: actor-caskfgl-name calbfgl: Inherits: ^Flag Tooltip: - Name: Libyan Flag + Name: actor-calbfgl-name cafrfgl: Inherits: ^Flag Tooltip: - Name: French Flag + Name: actor-cafrfgl-name cagefgl: Inherits: ^Flag Tooltip: - Name: German Flag + Name: actor-cagefgl-name cacufgl: Inherits: ^Flag Tooltip: - Name: Cuban Flag + Name: actor-cacufgl-name caukfgl: Inherits: ^Flag Tooltip: - Name: British Flag + Name: actor-caukfgl-name cacolo01: Inherits: ^CivBuilding @@ -1535,7 +1535,7 @@ cacolo01: Footprint: xxxxx xxxxx xxxxx Dimensions: 5, 3 Tooltip: - Name: Air Force Academy Chapel + Name: actor-cacolo01-name Health: HP: 1000 Armor: @@ -1563,7 +1563,7 @@ caind01: Footprint: xxxx xxxx xxxx xxxx Dimensions: 4, 4 Tooltip: - Name: Factory + Name: actor-caind01-name Health: HP: 1000 Armor: @@ -1591,7 +1591,7 @@ calab: Footprint: xxx xxx xxx xxx Dimensions: 3, 4 Tooltip: - Name: Einstein's Lab + Name: actor-calab-name Health: HP: 1000 Armor: @@ -1619,7 +1619,7 @@ cagas01: Footprint: xxx xxx xxx Dimensions: 3, 3 Tooltip: - Name: Gas Station + Name: actor-cagas01-name Health: HP: 1000 RevealsShroud: @@ -1641,7 +1641,7 @@ cagas01.rubble: galite: Inherits: ^CivBuilding Tooltip: - Name: Light Post + Name: actor-galite-name Valued: Cost: 200 RevealsShroud: @@ -1744,7 +1744,7 @@ city05: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Battersea Power Station + Name: actor-city05-name Armor: Type: Steel RevealsShroud: @@ -1766,7 +1766,7 @@ catech01: Inherits: ^CivBuilding Inherits@shape: ^3x3Shape Tooltip: - Name: Communications Center + Name: actor-catech01-name Armor: Type: Steel RevealsShroud: @@ -1824,7 +1824,7 @@ catexs02: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Alamo + Name: actor-catexs02-name Armor: Type: Concrete RevealsShroud: @@ -2020,7 +2020,7 @@ capars01: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Eiffel Tower + Name: actor-capars01-name Armor: Type: Steel Health: @@ -2161,7 +2161,7 @@ capars06.rubble: capars07: Inherits: ^CivBuilding Tooltip: - Name: Phone Booth + Name: actor-capars07-name RevealsShroud: Range: 6c0 Health: @@ -2229,7 +2229,7 @@ capars10: Inherits: ^CivBuilding Inherits@shape: ^4x3Shape Tooltip: - Name: Bistro + Name: actor-capars10-name RevealsShroud: Range: 6c0 Health: @@ -2257,7 +2257,7 @@ capars11: Inherits: ^CivBuilding Inherits@shape: ^3x4Shape Tooltip: - Name: Arc de Triumphe + Name: actor-capars11-name Armor: Type: Concrete RevealsShroud: @@ -2287,7 +2287,7 @@ capars12: Inherits: ^CivBuilding Inherits@shape: ^3x5Shape Tooltip: - Name: Notre Dame + Name: actor-capars12-name Armor: Type: Concrete RevealsShroud: @@ -2317,7 +2317,7 @@ capars13: Inherits: ^CivBuilding Inherits@shape: ^3x4Shape Tooltip: - Name: Bistro + Name: actor-capars13-name Armor: Type: Concrete RevealsShroud: @@ -2347,7 +2347,7 @@ capars14: Inherits: ^CivBuilding Inherits@shape: ^4x3Shape Tooltip: - Name: Bistro + Name: actor-capars14-name Armor: Type: Concrete RevealsShroud: @@ -2377,7 +2377,7 @@ cafrma: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Farmhouse + Name: actor-cafrma-name RevealsShroud: Range: 4c0 Health: @@ -2391,7 +2391,7 @@ cafrma: cafrmb: Inherits: ^CivBuilding Tooltip: - Name: Outhouse + Name: actor-cafrmb-name RevealsShroud: Range: 4c0 Health: @@ -2403,7 +2403,7 @@ caprs03: Inherits: ^CivBuilding Inherits@shape: ^6x4Shape Tooltip: - Name: Louvre + Name: actor-caprs03-name Armor: Type: Concrete RevealsShroud: @@ -2432,7 +2432,7 @@ caprs03.rubble: cagard01: Inherits: ^CivBuilding Tooltip: - Name: Guard Shack + Name: actor-cagard01-name Armor: Type: Steel RevealsShroud: @@ -2450,7 +2450,7 @@ carus01: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: St. Basil's Cathedral + Name: actor-carus01-name Armor: Type: Concrete RevealsShroud: @@ -2519,7 +2519,7 @@ carus02b.rubble: carus02g: Inherits: ^CivBuilding Tooltip: - Name: Kremlin Wall Clock Tower + Name: actor-carus02g-name Armor: Type: Concrete RevealsShroud: @@ -2542,7 +2542,7 @@ carus03: Inherits: ^CivBuilding Inherits@shape: ^2x5Shape Tooltip: - Name: Kremlin Palace + Name: actor-carus03-name Armor: Type: Concrete RevealsShroud: @@ -2827,7 +2827,7 @@ camiam03.rubble: camiam04: Inherits: ^CivBuilding Tooltip: - Name: Lifeguard Hut + Name: actor-camiam04-name RevealsShroud: Range: 6c0 Health: @@ -2923,7 +2923,7 @@ camiam08: Inherits: ^CivBuilding Inherits@shape: ^3x1Shape Tooltip: - Name: Arizona Memorial + Name: actor-camiam08-name Armor: Type: Steel RevealsShroud: @@ -3147,7 +3147,7 @@ camex01: Inherits: ^CivBuilding Inherits@shape: ^3x2Shape Tooltip: - Name: Mayan Pyramid + Name: actor-camex01-name Armor: Type: Concrete RevealsShroud: @@ -3177,7 +3177,7 @@ camex02: Inherits: ^CivBuilding Inherits@shape: ^6x4Shape Tooltip: - Name: Mayan Castillo + Name: actor-camex02-name Armor: Type: Concrete RevealsShroud: @@ -3207,7 +3207,7 @@ camex03: Inherits: ^CivBuilding Inherits@shape: ^3x3Shape Tooltip: - Name: Mayan Minor Temple + Name: actor-camex03-name Armor: Type: Concrete RevealsShroud: @@ -3237,7 +3237,7 @@ camex04: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Mayan Large Temple + Name: actor-camex04-name Armor: Type: Concrete RevealsShroud: @@ -3267,7 +3267,7 @@ camex05: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Mayan Platfrom + Name: actor-camex05-name Armor: Type: Concrete RevealsShroud: @@ -3295,7 +3295,7 @@ caeur1: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Cottage + Name: actor-caeur1-name RevealsShroud: Range: 6c0 Health: @@ -3321,7 +3321,7 @@ caeur2: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Cottage + Name: actor-caeur2-name RevealsShroud: Range: 6c0 Health: @@ -3457,7 +3457,7 @@ cachig04: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Associates Center + Name: actor-cachig04-name Armor: Type: Concrete RevealsShroud: @@ -3487,7 +3487,7 @@ cachig05: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Sears Tower + Name: actor-cachig05-name Armor: Type: Concrete RevealsShroud: @@ -3517,7 +3517,7 @@ cachig06: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Water Tower + Name: actor-cachig06-name Armor: Type: Steel Health: @@ -3657,7 +3657,7 @@ castl05a: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05a-name Armor: Type: Concrete RevealsShroud: @@ -3687,7 +3687,7 @@ castl05b: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05b-name Armor: Type: Concrete RevealsShroud: @@ -3717,7 +3717,7 @@ castl05c: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05c-name Armor: Type: Concrete RevealsShroud: @@ -3747,7 +3747,7 @@ castl05d: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05d-name Armor: Type: Concrete RevealsShroud: @@ -3777,7 +3777,7 @@ castl05e: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05e-name Armor: Type: Concrete RevealsShroud: @@ -3807,7 +3807,7 @@ castl05f: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05f-name Armor: Type: Concrete RevealsShroud: @@ -3837,7 +3837,7 @@ castl05g: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05g-name Armor: Type: Concrete RevealsShroud: @@ -3867,7 +3867,7 @@ castl05h: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: Stadium + Name: actor-castl05h-name Armor: Type: Concrete RevealsShroud: @@ -3897,7 +3897,7 @@ camsc07: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Hut + Name: actor-camsc07-name Armor: Type: Concrete RevealsShroud: @@ -3916,7 +3916,7 @@ camsc08: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Hut + Name: actor-camsc08-name RevealsShroud: Range: 6c0 Health: @@ -3930,7 +3930,7 @@ camsc09: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Hut + Name: actor-camsc09-name RevealsShroud: Range: 6c0 Health: @@ -3944,7 +3944,7 @@ camsc10: Inherits: ^CivBuilding Inherits@shape: ^4x4Shape Tooltip: - Name: McBurger Kong + Name: actor-camsc10-name RevealsShroud: Range: 6c0 Health: @@ -3970,7 +3970,7 @@ cabunk01: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Concrete Bunker + Name: actor-cabunk01-name Armor: Type: Steel RevealsShroud: @@ -3998,7 +3998,7 @@ cabunk02: Inherits: ^CivBuilding Inherits@shape: ^2x2Shape Tooltip: - Name: Concrete Bunker + Name: actor-cabunk02-name Armor: Type: Steel RevealsShroud: diff --git a/mods/ra2/rules/civilian-vehicles.yaml b/mods/ra2/rules/civilian-vehicles.yaml index 587a3aa52..c9af45282 100644 --- a/mods/ra2/rules/civilian-vehicles.yaml +++ b/mods/ra2/rules/civilian-vehicles.yaml @@ -1,7 +1,7 @@ bus: Inherits: ^CivVehicle Tooltip: - Name: School Bus + Name: actor-bus-name Cargo: Types: Infantry MaxWeight: 20 @@ -20,7 +20,7 @@ bus: limo: Inherits: ^CivVehicle Tooltip: - Name: Presidential Limousine + Name: actor-limo-name Cargo: Types: Infantry MaxWeight: 20 @@ -39,80 +39,80 @@ limo: pick: Inherits: ^CivVehicle Tooltip: - Name: Pickup Truck + Name: actor-pick-name car: Inherits: ^CivVehicle Tooltip: - Name: Automobile + Name: actor-car-name wini: Inherits: ^CivVehicle Tooltip: - Name: Recreational Vehicle + Name: actor-wini-name RenderVoxels: NormalsPalette: ts-normals propa: Inherits: ^CivVehicle Tooltip: - Name: Propaganda Truck + Name: actor-propa-name cop: Inherits: ^CivVehicle Tooltip: - Name: Police Car + Name: actor-cop-name euroc: Inherits: ^CivVehicle Tooltip: - Name: European Car + Name: actor-euroc-name RenderVoxels: NormalsPalette: ts-normals cona: Inherits: ^CivVehicle Tooltip: - Name: Excavator + Name: actor-cona-name RenderVoxels: NormalsPalette: ts-normals trucka: Inherits: ^CivVehicle Tooltip: - Name: Truck + Name: actor-trucka-name truckb: Inherits: ^CivVehicle Tooltip: - Name: Truck + Name: actor-truckb-name suvb: Inherits: ^CivVehicle Tooltip: - Name: Black SUV + Name: actor-suvb-name suvw: Inherits: ^CivVehicle Tooltip: - Name: White SUV + Name: actor-suvw-name stang: Inherits: ^CivVehicle Tooltip: - Name: Mustang - GenericName: Sports Car + Name: actor-stang.name + GenericName: actor-stang.generic-name RenderVoxels: NormalsPalette: ts-normals ptruck: Inherits: ^CivVehicle Tooltip: - Name: Pickup Truck + Name: actor-ptruck-name taxi: Inherits: ^CivVehicle Tooltip: - Name: Taxi + Name: actor-taxi-name RenderVoxels: NormalsPalette: ts-normals diff --git a/mods/ra2/rules/civilians.yaml b/mods/ra2/rules/civilians.yaml index 001d45be2..b5604a0f7 100644 --- a/mods/ra2/rules/civilians.yaml +++ b/mods/ra2/rules/civilians.yaml @@ -12,33 +12,33 @@ civ3: civa: Inherits: ^CivilianInfantry Tooltip: - Name: Texan + Name: actor-civa-name Voiced: VoiceSet: CivilianTexanVoice civb: Inherits: ^CivilianInfantry Tooltip: - Name: Texan + Name: actor-civb-name Voiced: VoiceSet: CivilianTexanVoice civc: Inherits: ^CivilianInfantry Tooltip: - Name: Texan + Name: actor-civc-name Voiced: VoiceSet: CivilianTexanVoice civbbp: Inherits: ^CivilianInfantry Tooltip: - Name: Baseball Player + Name: actor-civbbp-name civbfm: Inherits: ^CivilianInfantry Tooltip: - Name: Beach Fat Male + Name: actor-civbfm-name -WithInfantryBody: WithInfantryBody: IdleSequences: idle1 @@ -49,7 +49,7 @@ civbf: Voiced: VoiceSet: CivilianAlliedFemaleVoice Tooltip: - Name: Beach Fat Female + Name: actor-civbf-name -WithInfantryBody: WithInfantryBody: IdleSequences: idle1 @@ -58,7 +58,7 @@ civbf: civbtm: Inherits: ^CivilianInfantry Tooltip: - Name: Beach Thin Male + Name: actor-civbtm-name -WithInfantryBody: WithInfantryBody: IdleSequences: idle1 @@ -67,28 +67,28 @@ civbtm: civsfm: Inherits: ^CivilianInfantry Tooltip: - Name: Snow Fat Male + Name: actor-civsfm-name Voiced: VoiceSet: CivilianSovietMaleVoice civsf: Inherits: ^CivilianInfantry Tooltip: - Name: Snow Fat Male + Name: actor-civsf-name Voiced: VoiceSet: CivilianSovietFemaleVoice civstm: Inherits: ^CivilianInfantry Tooltip: - Name: Snow Thin Male + Name: actor-civstm-name Voiced: VoiceSet: CivilianSovietMaleVoice vladimir: Inherits: ^CivilianInfantry Tooltip: - Name: Vladimir + Name: actor-vladimir-name GenericVisibility: None WithInfantryBody: IdleSequences: idle1, idle2 @@ -96,7 +96,7 @@ vladimir: pentgen: Inherits: ^CivilianInfantry Tooltip: - Name: Pentagon General + Name: actor-pentgen-name GenericVisibility: None Voiced: VoiceSet: GIVoice @@ -104,7 +104,7 @@ pentgen: ssrv: Inherits: ^CivilianInfantry Tooltip: - Name: Secret Service + Name: actor-ssrv-name GenericVisibility: None Voiced: VoiceSet: SecretServiceVoice @@ -112,7 +112,7 @@ ssrv: pres: Inherits: ^CivilianInfantry Tooltip: - Name: President + Name: actor-pres-name GenericVisibility: None -WithInfantryBody: WithInfantryBody: diff --git a/mods/ra2/rules/defaults.yaml b/mods/ra2/rules/defaults.yaml index 7814962c9..6aa4930d9 100644 --- a/mods/ra2/rules/defaults.yaml +++ b/mods/ra2/rules/defaults.yaml @@ -423,7 +423,7 @@ RevealsShroud: Range: 4c0 Tooltip: - Name: Civilian Building + Name: meta-civbuilding-name MapEditorData: Categories: Civilian building @@ -475,7 +475,7 @@ Footprint: x Dimensions: 1, 1 Tooltip: - Name: Flag + Name: meta-flag-name Health: HP: 20 Armor: @@ -751,8 +751,8 @@ PlayerExperience: 2 Voice: Move Tooltip: - Name: Civilian - GenericName: Civilian + Name: meta-civilianinfantry.name + GenericName: meta-civilianinfantry.generic-name GenericVisibility: Enemy, Ally, Neutral GenericStancePrefix: false Health: @@ -896,7 +896,7 @@ Action: ChangeOwner RenderSprites: Tooltip: - GenericName: Civilian Vehicle + GenericName: meta-civvehicle-generic-name Valued: Cost: 800 Mobile: @@ -1011,7 +1011,7 @@ Type: CenterPosition ScriptTriggers: Tooltip: - GenericName: Destroyed Aircraft + GenericName: meta-husk-generic-name Health: HP: 1 FallsToEarth: @@ -1081,7 +1081,7 @@ CameraPitch: 85 UseClassicPerspectiveFudge: false Tooltip: - GenericName: Ship + GenericName: meta-ship-generic-name FireWarheadsOnDeath: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall @@ -1106,7 +1106,7 @@ ^OreDrill: Inherits@1: ^SpriteActor Tooltip: - Name: Ore Drill + Name: meta-oredrill-name WithSpriteBody: Building: Footprint: x @@ -1140,7 +1140,7 @@ AppearsOnRadar: BodyOrientation: Tooltip: - Name: Tree + Name: meta-tree-name QuantizeFacingsFromSequence: RenderSprites: Palette: terrain @@ -1159,7 +1159,7 @@ ^StreetSign: Inherits: ^Tree Tooltip: - Name: Street Sign + Name: meta-streetsign-name MapEditorData: Categories: Decoration -MirageTarget: @@ -1167,7 +1167,7 @@ ^TrafficLight: Inherits: ^Tree Tooltip: - Name: Traffic Light + Name: meta-trafficlight-name MapEditorData: Categories: Decoration -MirageTarget: @@ -1175,7 +1175,7 @@ ^StreetLight: Inherits: ^Tree Tooltip: - Name: Street Light + Name: meta-streetlight-name Armor: Type: steel Health: @@ -1187,7 +1187,7 @@ ^TelephonePole: Inherits: ^Tree Tooltip: - Name: Utility Pole + Name: meta-telephonepole-name Health: HP: 20 Armor: @@ -1206,7 +1206,7 @@ AppearsOnRadar: BodyOrientation: Tooltip: - Name: Rock + Name: meta-rock-name QuantizeFacingsFromSequence: RenderSprites: Palette: terrain @@ -1220,8 +1220,8 @@ Inherits@1: ^SpriteActor HiddenUnderFog: Tooltip: - Name: Crate - GenericName: Crate + Name: meta-crate.name + GenericName: meta-crate.generic-name Crate: TerrainTypes: Clear, Rough, Road, Ore, Gems RenderSprites: diff --git a/mods/ra2/rules/misc.yaml b/mods/ra2/rules/misc.yaml index c26e1ed99..c75779acb 100644 --- a/mods/ra2/rules/misc.yaml +++ b/mods/ra2/rules/misc.yaml @@ -1,7 +1,7 @@ mpspawn: Interactable: EditorOnlyTooltip: - Name: (Multiplayer Spawnpoint) + Name: actor-mpspawn-name Immobile: OccupiesSpace: false BodyOrientation: @@ -17,7 +17,7 @@ mpspawn: waypoint: Interactable: EditorOnlyTooltip: - Name: (Waypoint for scripted behavior) + Name: actor-waypoint-name Immobile: OccupiesSpace: false BodyOrientation: @@ -112,7 +112,7 @@ CAMERA: RenderSpritesEditorOnly: Image: camera EditorOnlyTooltip: - Name: (reveals area to owner) + Name: actor-camera-name MapEditorData: Categories: System @@ -144,7 +144,7 @@ FLAMEGUY: INGALITE: Interactable: EditorOnlyTooltip: - Name: (Invisible Light Post) + Name: actor-ingalite-name AlwaysVisible: Immobile: OccupiesSpace: false @@ -168,7 +168,7 @@ INGALITE: NEGLAMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Negative Light Post) + Name: actor-neglamp-name TerrainLightSource: Range: 13c688 Intensity: -0.15 @@ -179,7 +179,7 @@ NEGLAMP: INYELWLAMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Yellow Light Post) + Name: actor-inyelwlamp-name TerrainLightSource: Range: 15c640 Intensity: 0.01 @@ -190,7 +190,7 @@ INYELWLAMP: INPURPLAMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Purple Light Post) + Name: actor-inpurplamp-name TerrainLightSource: Range: 11c736 Intensity: 0.01 @@ -201,7 +201,7 @@ INPURPLAMP: INORANLAMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Orange Light Post) + Name: actor-inoranlamp-name TerrainLightSource: Range: 11c736 Intensity: 0.01 @@ -212,7 +212,7 @@ INORANLAMP: INGRNLMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Green Light Post) + Name: actor-ingrnlmp-name TerrainLightSource: Range: 15c640 Intensity: 0.01 @@ -223,7 +223,7 @@ INGRNLMP: INREDLMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Red Light Post) + Name: actor-inredlmp-name TerrainLightSource: Range: 15c640 Intensity: 0.01 @@ -234,7 +234,7 @@ INREDLMP: INBLULMP: Inherits: INGALITE EditorOnlyTooltip: - Name: (Invisible Blue Light Post) + Name: actor-inblulmp-name TerrainLightSource: Range: 15c640 Intensity: 0.01 diff --git a/mods/ra2/rules/soviet-infantry.yaml b/mods/ra2/rules/soviet-infantry.yaml index 197edeaa7..545191d74 100644 --- a/mods/ra2/rules/soviet-infantry.yaml +++ b/mods/ra2/rules/soviet-infantry.yaml @@ -7,7 +7,7 @@ e2: Queue: Infantry Prerequisites: ~nahand BuildPaletteOrder: 20 - Description: Cheap rifle infantry.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-e2.description Valued: Cost: 100 UpdatesPlayerStatistics: @@ -17,7 +17,7 @@ e2: PlayerExperience: 5 Voice: Move Tooltip: - Name: Conscript + Name: actor-e2.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -53,7 +53,7 @@ flakt: Queue: Infantry Prerequisites: naradr, ~nahand BuildPaletteOrder: 70 - Description: Anti-Air/Anti-Infantry unit.\n Strong vs Aircraft, Infantry\n Weak vs Vehicles + Description: actor-flakt.description Valued: Cost: 300 UpdatesPlayerStatistics: @@ -63,7 +63,7 @@ flakt: PlayerExperience: 5 Voice: Move Tooltip: - Name: Flak Trooper + Name: actor-flakt.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -115,7 +115,7 @@ shk: BuildAtProductionType: Infantry Prerequisites: ~nahand BuildPaletteOrder: 50 - Description: Special armored unit using electricity.\n Strong vs Infantry, Light armor\n Weak vs Tanks, Aircraft\nSpecial ability: Charge tesla coils + Description: actor-shk.description Valued: Cost: 500 UpdatesPlayerStatistics: @@ -125,7 +125,7 @@ shk: PlayerExperience: 25 Voice: Move Tooltip: - Name: Tesla Trooper + Name: actor-shk.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -178,7 +178,7 @@ terror: BuildAtProductionType: Infantry BuildPaletteOrder: 90 Prerequisites: naradr, ~infantry.cuba - Description: Carries C4 charges taped to his body and kamikazes enemies\nblowing them up quickly and efficiently.\n Strong vs Ground units\n Weak vs Aircraft + Description: actor-terror.description Valued: Cost: 200 UpdatesPlayerStatistics: @@ -188,7 +188,7 @@ terror: PlayerExperience: 10 Voice: Move Tooltip: - Name: Terrorist + Name: actor-terror.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -234,7 +234,7 @@ deso: BuildAtProductionType: Infantry BuildPaletteOrder: 120 Prerequisites: naradr, ~infantry.iraq - Description: Carries a radiation-emitting weapon.\nCan deploy for area-of-effect damage.\n Strong vs Infantry, Light armor\n Weak vs Tanks, Aircraft + Description: actor-deso.description Valued: Cost: 600 UpdatesPlayerStatistics: @@ -244,7 +244,7 @@ deso: PlayerExperience: 10 Voice: Move Tooltip: - Name: Desolator + Name: actor-deso.name Selectable: Bounds: 482, 1448, 0, -530 Health: @@ -305,7 +305,7 @@ ivan: BuildAtProductionType: Infantry BuildPaletteOrder: 110 Prerequisites: naradr, ~nahand - Description: Specialist for explosives. Can plant a Bomb on anything, even Cows. + Description: actor-ivan.description Valued: Cost: 600 UpdatesPlayerStatistics: @@ -315,7 +315,7 @@ ivan: PlayerExperience: 30 Voice: Move Tooltip: - Name: Crazy Ivan + Name: actor-ivan.name Selectable: Bounds: 482, 1448, 0, -530 Voiced: @@ -354,9 +354,9 @@ civan: Buildable: BuildPaletteOrder: 180 Prerequisites: ~nahand, ~allies.tech.infiltrated - Description: Specialist for explosives. Can plant a Bomb on anything, even Cows. Can teleport on anywhere on the map. + Description: actor-civan.description Tooltip: - Name: Chrono Ivan + Name: actor-civan.name Valued: Cost: 1000 UpdatesPlayerStatistics: @@ -384,7 +384,7 @@ yuri: BuildAtProductionType: Infantry BuildPaletteOrder: 160 Prerequisites: natech, ~nahand - Description: Psychic infantry. Can mind control enemy units.\nCan be deployed to unleash a powerful psychic wave.\n Strong vs Infantry, Vehicles\n Weak vs Terror Drones, Aircraft, Buildings + Description: actor-yuri.description Valued: Cost: 1200 UpdatesPlayerStatistics: @@ -394,7 +394,7 @@ yuri: PlayerExperience: 60 Voice: Move Tooltip: - Name: Yuri + Name: actor-yuri.name Selectable: Bounds: 482, 1448, 0, -530 Voiced: @@ -462,9 +462,9 @@ yuripr: BuildLimit: 1 BuildPaletteOrder: 290 Prerequisites: ~nahand, ~soviets.tech.infiltrated - Description: Psychic infantry. Can mind control enemy units from a great range.\nCan be deployed to unleash a powerful psychic wave.\n Strong vs Infantry, Vehicles\n Weak vs Terror Drones, Aircraft, Buildings\n\nMaximum 1 can be trained. + Description: actor-yuripr.description Tooltip: - Name: Yuri Prime + Name: actor-yuripr.name Valued: Cost: 2000 UpdatesPlayerStatistics: diff --git a/mods/ra2/rules/soviet-naval.yaml b/mods/ra2/rules/soviet-naval.yaml index dec9b54e7..d08028b70 100644 --- a/mods/ra2/rules/soviet-naval.yaml +++ b/mods/ra2/rules/soviet-naval.yaml @@ -5,13 +5,13 @@ sapc: Queue: Ship BuildPaletteOrder: 10 Prerequisites: ~nayard - Description: General-purpose naval transport.\nCan carry infantry and vehicles.\n Unarmed + Description: actor-sapc.description Valued: Cost: 900 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Amphibious Transport + Name: actor-sapc.name Selectable: Bounds: 1448, 3861, 0, -289 Health: @@ -56,13 +56,13 @@ sub: Queue: Ship BuildPaletteOrder: 20 Prerequisites: ~nayard - Description: Submerged anti-ship unit armed with\ntorpedoes.\nCan detect other submarines and Giant Squids.\n Strong vs Ships\n Weak vs Ground units, Aircraft\nSpecial Ability: Submerge + Description: actor-sub.description Valued: Cost: 1000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Typhoon Attack Sub + Name: actor-sub.name Health: HP: 600 Armor: @@ -128,13 +128,13 @@ hyd: Queue: Ship BuildPaletteOrder: 30 Prerequisites: naradr, ~nayard - Description: Anti-Air/Anti-Infantry naval unit.\n Strong vs Aircraft, Infantry\n Weak vs Vehicles, Naval Units + Description: actor-hyd.description Valued: Cost: 900 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Sea Scorpion + Name: actor-hyd.name Selectable: Bounds: 1206, 1448, 0, -289 Health: @@ -174,13 +174,13 @@ sqd: Queue: Ship BuildPaletteOrder: 40 Prerequisites: natech, ~nayard - Description: Ocean creature\npunches enemies in close combat.\n Strong vs Ships + Description: actor-sqd.description Valued: Cost: 1000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Giant Squid + Name: actor-sqd.name Armor: Type: Light Health: diff --git a/mods/ra2/rules/soviet-structures.yaml b/mods/ra2/rules/soviet-structures.yaml index fdd8583aa..b611cbe3a 100644 --- a/mods/ra2/rules/soviet-structures.yaml +++ b/mods/ra2/rules/soviet-structures.yaml @@ -5,7 +5,7 @@ nacnst: Queue: Building BuildPaletteOrder: 1000 Prerequisites: ~disabled - Description: Allows construction of base structures. + Description: actor-nacnst.description Building: Footprint: xxxx xxxx xxxx xxxx Dimensions: 4,4 @@ -24,7 +24,7 @@ nacnst: Production: Produces: Building, Support Tooltip: - Name: Construction Yard + Name: actor-nacnst.name BaseBuilding: BaseProvider: Range: 0 @@ -80,11 +80,11 @@ napowr: Queue: Building BuildPaletteOrder: 10 Prerequisites: ~structures.soviets - Description: Provides power for other structures. + Description: actor-napowr.description Valued: Cost: 600 Tooltip: - Name: Tesla Reactor + Name: actor-napowr.name ProvidesPrerequisite: Prerequisite: power Building: @@ -127,11 +127,11 @@ nahand: Queue: Building BuildPaletteOrder: 20 Prerequisites: power, ~structures.soviets - Description: Produces infantry. + Description: actor-nahand.description Valued: Cost: 500 Tooltip: - Name: Barracks + Name: actor-nahand.name ProvidesPrerequisite: Prerequisite: barracks ProvidesPrerequisite@cuba: @@ -227,13 +227,13 @@ narefn: Queue: Building BuildPaletteOrder: 30 Prerequisites: power, ~structures.soviets - Description: Processes ore into credits. + Description: actor-narefn.description IsometricSelectable: Height: 90 Valued: Cost: 2000 Tooltip: - Name: Ore Refinery + Name: actor-narefn.name ProvidesPrerequisite: Prerequisite: refinery ProvidesPrerequisite@default: @@ -290,11 +290,11 @@ naradr: Queue: Building BuildPaletteOrder: 60 Prerequisites: power, narefn, ~structures.soviets - Description: Provides radar. + Description: actor-naradr.description Valued: Cost: 1000 Tooltip: - Name: Radar Tower + Name: actor-naradr.name ProvidesPrerequisite: Prerequisite: radar ProvidesPrerequisite@default: @@ -337,13 +337,13 @@ naweap: Queue: Building BuildPaletteOrder: 40 Prerequisites: refinery, nahand, ~structures.soviets - Description: Produces vehicles. + Description: actor-naweap.description IsometricSelectable: Height: 90 Valued: Cost: 2000 Tooltip: - Name: War Factory + Name: actor-naweap.name ProvidesPrerequisite@libya: Prerequisite: vehicles.libya Factions: libya @@ -428,12 +428,12 @@ nayard: Valued: Cost: 1000 Tooltip: - Name: Naval Yard + Name: actor-nayard.name Buildable: Queue: Building BuildPaletteOrder: 50 Prerequisites: power, refinery, ~structures.soviets - Description: Produces and repairs ships,\nsubmarines, transports, and other naval units. + Description: actor-nayard.description Targetable: TargetTypes: Ground, Water, C4 ProvidesPrerequisite@default: @@ -566,13 +566,13 @@ nadept: Queue: Building BuildPaletteOrder: 70 Prerequisites: naweap, ~structures.soviets - Description: Repairs vehicles and removes Terror Drones (for a price). + Description: actor-nadept.description IsometricSelectable: Height: 90 Valued: Cost: 800 Tooltip: - Name: Service Depot + Name: actor-nadept.name ProvidesPrerequisite: Prerequisite: repairpad Building: @@ -618,11 +618,11 @@ nanrct: Queue: Building BuildPaletteOrder: 90 Prerequisites: natech, ~structures.soviets - Description: Provides power for other structures. + Description: actor-nanrct.description Valued: Cost: 1000 Tooltip: - Name: Nuclear Reactor + Name: actor-nanrct.name ProvidesPrerequisite: Prerequisite: power Building: @@ -669,11 +669,11 @@ natech: Queue: Building BuildPaletteOrder: 80 Prerequisites: naweap, naradr, ~structures.soviets - Description: Allows deployment of advanced units. + Description: actor-natech.description Valued: Cost: 2000 Tooltip: - Name: Battle Lab + Name: actor-natech.name ProvidesPrerequisite@default: Building: Footprint: xxx xxx xxx @@ -707,11 +707,11 @@ naclon: BuildPaletteOrder: 100 Prerequisites: natech, ~structures.soviets BuildLimit: 1 - Description: Clones most trained infantry. + Description: actor-naclon.description Valued: Cost: 2500 Tooltip: - Name: Cloning Vats + Name: actor-naclon.name Building: Footprint: xx xx Dimensions: 2, 2 @@ -785,11 +785,11 @@ napsis: Queue: Support BuildPaletteOrder: 60 Prerequisites: natech, ~structures.soviets - Description: Detects enemy units and strikepoints + Description: actor-napsis.description Valued: Cost: 1000 Tooltip: - Name: Psychic Sensor + Name: actor-napsis.name Building: Footprint: xx xx Dimensions: 2,2 @@ -825,11 +825,11 @@ nairon: BuildPaletteOrder: 80 Prerequisites: natech, ~structures.soviets, ~techlevel.unrestricted BuildLimit: 1 - Description: Grants invulnerability to armored units.\nFries fleshy units. + Description: actor-nairon.description Valued: Cost: 2500 Tooltip: - Name: Iron Curtain Device + Name: actor-nairon.name Building: Footprint: xxx xxx xxx Dimensions: 3, 3 @@ -846,8 +846,8 @@ nairon: GrantExternalConditionPower@IRONCURTAIN: Icon: invuln ChargeInterval: 7500 - Name: Iron Curtain - Description: Makes a group of units invulnerable\nfor 20 seconds. + Name: actor-nairon.grantexternalconditionpower-ironcurtain-name + Description: actor-nairon.grantexternalconditionpower-ironcurtain-description Duration: 500 # TODO: These are actually no speech notifications EndChargeSound: siroread.wav @@ -880,11 +880,11 @@ namisl: BuildPaletteOrder: 90 Prerequisites: natech, ~structures.soviets, ~techlevel.unrestricted BuildLimit: 1 - Description: Provides an atomic bomb.\nRequires power to operate.\n Special Ability: Atom Bomb\nMaximum 1 can be built. + Description: actor-namisl.description Valued: Cost: 5000 Tooltip: - Name: Nuclear Missile Silo + Name: actor-namisl.name Building: Footprint: xxx xxx xxx Dimensions: 3, 3 @@ -910,8 +910,8 @@ namisl: Cursor: nuke Icon: abomb ChargeInterval: 15000 - Name: Nuclear Missile - Description: Launches a devastating atomic bomb\nat a target location. + Name: actor-namisl.nukepower-name + Description: actor-namisl.nukepower-description EndChargeSound: snukread.wav EndChargeSpeechNotification: AtomBombReady LaunchSound: snuklaun.wav @@ -948,9 +948,9 @@ nawall: Queue: Support BuildPaletteOrder: 10 Prerequisites: barracks, ~structures.soviets - Description: Light wall.\nCrushable by vehicles. + Description: actor-nawall.description Tooltip: - Name: Soviet Wall + Name: actor-nawall.name naflak: Inherits: ^VoxelLighting @@ -959,11 +959,11 @@ naflak: Queue: Support BuildPaletteOrder: 30 Prerequisites: barracks, ~structures.soviets - Description: Automated anti-aircraft defense. + Description: actor-naflak.description Valued: Cost: 1000 Tooltip: - Name: Flak Cannon + Name: actor-naflak.name Building: Footprint: x Dimensions: 1, 1 @@ -1010,11 +1010,11 @@ tesla: Queue: Support BuildPaletteOrder: 40 Prerequisites: naradr, ~structures.soviets - Description: Advanced base defense.\nRequires power to operate.\n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-tesla.description Valued: Cost: 1500 Tooltip: - Name: Tesla Coil + Name: actor-tesla.name Building: Footprint: x Dimensions: 1, 1 @@ -1067,11 +1067,11 @@ nalasr: Queue: Support BuildPaletteOrder: 20 Prerequisites: barracks, ~structures.soviets - Description: Automated anti-infantry defense. + Description: actor-nalasr.description Valued: Cost: 500 Tooltip: - Name: Sentry Gun + Name: actor-nalasr.name Building: Footprint: x Dimensions: 1, 1 diff --git a/mods/ra2/rules/soviet-vehicles.yaml b/mods/ra2/rules/soviet-vehicles.yaml index b4d3fc3ba..0e2c47fb6 100644 --- a/mods/ra2/rules/soviet-vehicles.yaml +++ b/mods/ra2/rules/soviet-vehicles.yaml @@ -5,13 +5,13 @@ smcv: Queue: Vehicle BuildPaletteOrder: 80 Prerequisites: ~naweap, repairpad - Description: Deploys into a Construction Yard. + Description: actor-smcv.description Valued: Cost: 3000 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Mobile Construction Vehicle + Name: actor-smcv.name Selectable: Priority: 4 Bounds: 1544, 2509, 0, -289 @@ -49,13 +49,13 @@ harv: Queue: Vehicle BuildPaletteOrder: 10 Prerequisites: ~naweap, refinery - Description: Gathers Ore.\n Strong vs Infantry\n Weak vs Vehicles, Aircraft + Description: actor-harv.description Valued: Cost: 1400 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: War Miner + Name: actor-harv.name Selectable: Priority: 7 Bounds: 1544, 2509, 0, -289 @@ -125,12 +125,12 @@ dron: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Terror Drone + Name: actor-dron.name Buildable: Queue: Vehicle BuildPaletteOrder: 40 Prerequisites: ~naweap - Description: \n Strong vs Infantry, Vehicles\n Weak vs Aircraft + Description: actor-dron.description Mobile: Speed: 150 TurnSpeed: 60 @@ -174,14 +174,14 @@ htk: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Flak Track + Name: actor-htk.name Selectable: Bounds: 1206, 1930, 0, -289 Buildable: Queue: Vehicle BuildPaletteOrder: 30 Prerequisites: ~naweap - Description: Infantry Transport and Anti-Air/Anti-Infantry vehicle.\n Strong vs Aircraft, Infantry\n Weak vs Vehicles + Description: actor-htk.description Mobile: Speed: 120 TurnSpeed: 20 @@ -243,12 +243,12 @@ htnk: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Rhino Heavy Tank + Name: actor-htnk.name Buildable: Queue: Vehicle BuildPaletteOrder: 20 Prerequisites: ~naweap - Description: Soviet Main Battle Tank.\n Strong vs Vehicles\n Weak vs Infantry, Aircraft + Description: actor-htnk.description Mobile: Speed: 90 TurnSpeed: 20 @@ -298,12 +298,12 @@ apoc: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Apocalypse Tank + Name: actor-apoc.name Buildable: Queue: Vehicle BuildPaletteOrder: 70 Prerequisites: ~naweap, natech - Description: Soviet Advanced Battle Tank with Double Barrel\nand Anti-Aircraft Missile Launcher.\n Strong vs Vehicles, Aircraft\n Weak vs Infantry + Description: actor-apoc.description Mobile: Speed: 60 TurnSpeed: 20 @@ -358,12 +358,12 @@ ttnk: UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Tesla Tank + Name: actor-ttnk.name Buildable: Queue: Vehicle BuildPaletteOrder: 50 Prerequisites: ~naweap, naradr, ~vehicles.russia - Description: Russian special tank armed with dual small Tesla Coils.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Description: actor-ttnk.description Mobile: Speed: 90 Locomotor: heavytracked @@ -405,13 +405,13 @@ dtruck: Queue: Vehicle BuildPaletteOrder: 60 Prerequisites: naradr, ~vehicles.libya - Description: Demolition Truck, actively armed with nuclear explosives. + Description: actor-dtruck.description Valued: Cost: 1500 UpdatesPlayerStatistics: AddToArmyValue: true Tooltip: - Name: Demolition Truck + Name: actor-dtruck.name Selectable: Bounds: 1544, 2509, 0, -289 Health: diff --git a/mods/ra2/rules/tech-structures.yaml b/mods/ra2/rules/tech-structures.yaml index 79d85121c..dd7fd53ab 100644 --- a/mods/ra2/rules/tech-structures.yaml +++ b/mods/ra2/rules/tech-structures.yaml @@ -11,7 +11,7 @@ caoild: Interval: 100 Amount: 20 Tooltip: - Name: Tech Oil Derrick + Name: actor-caoild-name Health: HP: 1000 RevealsShroud: @@ -44,7 +44,7 @@ caairp: Inherits: ^TechBuilding Inherits@shape: ^3x2Shape Tooltip: - Name: Tech Airport + Name: actor-caairp.name Armor: Type: concrete Health: @@ -66,8 +66,8 @@ caairp: OrderName: AlliedParatroopers Icon: paradrop ChargeInterval: 9000 - Name: Allied Paratroopers - Description: A Cargo Plane drops six GIs\nanywhere on the map. + Name: actor-caairp.paratrooperspower-allies-name + Description: actor-caairp.paratrooperspower-allies-description DropItems: e1,e1,e1,e1,e1,e1 QuantizedFacings: 8 UnitType: pdplane @@ -78,8 +78,8 @@ caairp: OrderName: SovietParatroopers Icon: paradrop ChargeInterval: 9000 - Name: Soviet Paratroopers - Description: A Cargo Plane drops nine conscripts\nanywhere on the map. + Name: actor-caairp.paratrooperspower-soviets-name + Description: actor-caairp.paratrooperspower-soviets-description DropItems: e2,e2,e2,e2,e2,e2,e2,e2,e2 QuantizedFacings: 8 UnitType: pdplane @@ -111,7 +111,7 @@ cahosp: IsometricSelectable: Height: 105 Tooltip: - Name: Civilian Hospital + Name: actor-cahosp-name Health: HP: 800 RevealsShroud: @@ -143,7 +143,7 @@ cahosp.rubble: cathosp: Inherits: cahosp EditorOnlyTooltip: - Name: Tech Hospital + Name: actor-cathosp-name RenderSprites: Image: cahosp @@ -153,7 +153,7 @@ caoutp: IsometricSelectable: Height: 90 Tooltip: - Name: Tech Outpost + Name: actor-caoutp-name Armor: Type: Concrete Health: diff --git a/mods/ra2/rules/world.yaml b/mods/ra2/rules/world.yaml index a218855db..1041fe60b 100644 --- a/mods/ra2/rules/world.yaml +++ b/mods/ra2/rules/world.yaml @@ -124,68 +124,68 @@ FogPalette: shroud ShroudPalette: shroud Faction@random: - Name: Random + Name: meta-baseworld.faction-random-name InternalName: Random RandomFactionMembers: random-allies, random-soviets Side: Randoms - Description: Random Country\nA random country will be chosen when the game starts. + Description: meta-baseworld.faction-random-description Faction@allies: - Name: Allies + Name: meta-baseworld.faction-allies-name InternalName: random-allies RandomFactionMembers: america, germany, england, france, korea Side: Randoms - Description: Random Allied Country\nA random Allied country will be chosen when the game starts. + Description: meta-baseworld.faction-allies-description Faction@soviets: - Name: Soviets + Name: meta-baseworld.faction-soviets-name InternalName: random-soviets RandomFactionMembers: cuba, libya, iraq, russia Side: Randoms - Description: Random Soviet Country\nA random Soviet country will be chosen when the game starts. + Description: meta-baseworld.faction-soviets-description Faction@1: - Name: America + Name: meta-baseworld.faction-1-name InternalName: america Side: Allies - Description: America\nSpecial Ability: Paratroopers + Description: meta-baseworld.faction-1-description Faction@2: - Name: Germany + Name: meta-baseworld.faction-2-name InternalName: germany Side: Allies - Description: Germany\nSpecial Vehicle: Tank Destroyer + Description: meta-baseworld.faction-2-description Faction@3: - Name: England + Name: meta-baseworld.faction-3-name InternalName: england Side: Allies - Description: England\nSpecial Infantry: Sniper + Description: meta-baseworld.faction-3-description Faction@4: - Name: France + Name: meta-baseworld.faction-4-name InternalName: france Side: Allies - Description: France\nSpecial Building: Grand Cannon + Description: meta-baseworld.faction-4-description Faction@5: - Name: Korea + Name: meta-baseworld.faction-5-name InternalName: korea Side: Allies - Description: Korea\nSpecial Aircraft: Black Eagle + Description: meta-baseworld.faction-5-description Faction@6: - Name: Cuba + Name: meta-baseworld.faction-6-name InternalName: cuba Side: Soviets - Description: Cuba\nSpecial Infantry: Terrorist + Description: meta-baseworld.faction-6-description Faction@7: - Name: Libya + Name: meta-baseworld.faction-7-name InternalName: libya Side: Soviets - Description: Libya\nSpecial Vehicle: Demolition Truck + Description: meta-baseworld.faction-7-description Faction@8: - Name: Iraq + Name: meta-baseworld.faction-8-name InternalName: iraq Side: Soviets - Description: Iraq\nSpecial Infantry: Desolator + Description: meta-baseworld.faction-8-description Faction@9: - Name: Russia + Name: meta-baseworld.faction-9-name InternalName: russia Side: Soviets - Description: Russia\nSpecial Vehicle: Tesla Tank + Description: meta-baseworld.faction-9-description CliffBackImpassabilityLayer: Selection: ControlGroups: From f5b815be5d133fa863f058a9f8e0e6da62116083 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 22 Apr 2025 23:21:52 +0300 Subject: [PATCH 17/21] Fixed a bunch of Utility warnings Refinery.TickLifetime and TickVelocity were removed in OpenRA PR 20636 as they were apparently unused for a long, long time. --- mods/ra2/fluent/assetbrowser.ftl | 5 +++++ mods/ra2/fluent/hotkeys.ftl | 7 +++++++ mods/ra2/fluent/rules.ftl | 5 ++--- mods/ra2/hotkeys.yaml | 18 ++++++++++++------ mods/ra2/mod.yaml | 2 ++ mods/ra2/rules/allied-structures.yaml | 2 -- mods/ra2/rules/defaults.yaml | 4 ---- mods/ra2/rules/soviet-structures.yaml | 2 -- mods/ra2/rules/world.yaml | 4 ++-- 9 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 mods/ra2/fluent/assetbrowser.ftl create mode 100644 mods/ra2/fluent/hotkeys.ftl diff --git a/mods/ra2/fluent/assetbrowser.ftl b/mods/ra2/fluent/assetbrowser.ftl new file mode 100644 index 000000000..90551ea1d --- /dev/null +++ b/mods/ra2/fluent/assetbrowser.ftl @@ -0,0 +1,5 @@ +## assetbrowser.yaml +label-assetbrowser-model-scale = Scale: +label-voxel-selector-roll = Roll +label-voxel-selector-pitch = Pitch +label-voxel-selector-yaw = Yaw \ No newline at end of file diff --git a/mods/ra2/fluent/hotkeys.ftl b/mods/ra2/fluent/hotkeys.ftl new file mode 100644 index 000000000..6032b798d --- /dev/null +++ b/mods/ra2/fluent/hotkeys.ftl @@ -0,0 +1,7 @@ +## hotkeys.yaml +hotkey-description-productiontypebuilding = Building Tab +hotkey-description-productiontypedefense = Defense Tab +hotkey-description-productiontypeinfantry = Infantry Tab +hotkey-description-productiontypevehicle = Vehicle Tab +hotkey-description-productiontypeaircraft = Aircraft Tab +hotkey-description-productiontypenaval = Naval Tab diff --git a/mods/ra2/fluent/rules.ftl b/mods/ra2/fluent/rules.ftl index 9303a393b..f9a092636 100644 --- a/mods/ra2/fluent/rules.ftl +++ b/mods/ra2/fluent/rules.ftl @@ -16,9 +16,6 @@ options-starting-units = .medium = Medium .heavy = Heavy -options-difficulty = - .normal = Normal - ## ai.yaml actor-player-modularbot-testai-name = Test AI @@ -881,3 +878,5 @@ meta-baseworld = .faction-9-description = Russia Special Vehicle: Tesla Tank + +resource-minerals = Valuable Minerals \ No newline at end of file diff --git a/mods/ra2/hotkeys.yaml b/mods/ra2/hotkeys.yaml index 760c6bc11..db2212baa 100644 --- a/mods/ra2/hotkeys.yaml +++ b/mods/ra2/hotkeys.yaml @@ -1,23 +1,29 @@ ProductionTypeBuilding: E - Description: Building Tab + Description: hotkey-description-productiontypebuilding Types: Production + Contexts: player ProductionTypeDefense: R - Description: Defense Tab + Description: hotkey-description-productiontypedefense Types: Production + Contexts: player ProductionTypeInfantry: T - Description: Infantry Tab + Description: hotkey-description-productiontypeinfantry Types: Production + Contexts: player ProductionTypeVehicle: Y - Description: Vehicle Tab + Description: hotkey-description-productiontypevehicle Types: Production + Contexts: player ProductionTypeAircraft: U - Description: Aircraft Tab + Description: hotkey-description-productiontypeaircraft Types: Production + Contexts: player ProductionTypeNaval: I - Description: Naval Tab + Description: hotkey-description-productiontypenaval Types: Production + Contexts: player diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index 901fe80b6..bdb55a8f7 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -205,7 +205,9 @@ FluentMessages: common|fluent/chrome.ftl common|fluent/hotkeys.ftl common|fluent/rules.ftl + ra2|fluent/assetbrowser.ftl ra2|fluent/chrome.ftl + ra2|fluent/hotkeys.ftl ra2|fluent/mod.ftl ra2|fluent/rules.ftl diff --git a/mods/ra2/rules/allied-structures.yaml b/mods/ra2/rules/allied-structures.yaml index 236c6e16d..69a130692 100644 --- a/mods/ra2/rules/allied-structures.yaml +++ b/mods/ra2/rules/allied-structures.yaml @@ -233,8 +233,6 @@ garefn: Range: 6c0 Refinery: ShowTicks: True - TickLifetime: 30 - TickVelocity: 1 TickRate: 10 UseStorage: false CustomSellValue: diff --git a/mods/ra2/rules/defaults.yaml b/mods/ra2/rules/defaults.yaml index 6aa4930d9..c09d58ab2 100644 --- a/mods/ra2/rules/defaults.yaml +++ b/mods/ra2/rules/defaults.yaml @@ -474,8 +474,6 @@ Building: Footprint: x Dimensions: 1, 1 - Tooltip: - Name: meta-flag-name Health: HP: 20 Armor: @@ -1186,8 +1184,6 @@ ^TelephonePole: Inherits: ^Tree - Tooltip: - Name: meta-telephonepole-name Health: HP: 20 Armor: diff --git a/mods/ra2/rules/soviet-structures.yaml b/mods/ra2/rules/soviet-structures.yaml index b611cbe3a..a1d3e1cf3 100644 --- a/mods/ra2/rules/soviet-structures.yaml +++ b/mods/ra2/rules/soviet-structures.yaml @@ -248,8 +248,6 @@ narefn: Range: 6c0 Refinery: ShowTicks: True - TickLifetime: 30 - TickVelocity: 1 TickRate: 10 UseStorage: false CustomSellValue: diff --git a/mods/ra2/rules/world.yaml b/mods/ra2/rules/world.yaml index 1041fe60b..fec19e351 100644 --- a/mods/ra2/rules/world.yaml +++ b/mods/ra2/rules/world.yaml @@ -15,11 +15,11 @@ Ore: Sequences: tib01, tib02, tib03, tib04, tib05, tib06, tib07, tib08, tib09, tib10, tib11, tib12, tib13, tib14, tib15, tib16, tib17, tib18, tib19, tib20 Palette: resource - Name: Valuable Minerals + Name: resource-minerals Gems: Sequences: gem01, gem02, gem03, gem04, gem05, gem06, gem07, gem08, gem09, gem10, gem11, gem12 Palette: resource - Name: Valuable Minerals + Name: resource-minerals TerrainLighting: DebugVisualizations: Locomotor@FOOT: From d2073521100700477efe169624b6975a920100b0 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 22 Apr 2025 22:37:46 +0300 Subject: [PATCH 18/21] MISC --- mods/ra2/chrome.yaml | 13 +++++++++++++ mods/ra2/mod.yaml | 4 +--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mods/ra2/chrome.yaml b/mods/ra2/chrome.yaml index 3e45c33ac..745e395e2 100644 --- a/mods/ra2/chrome.yaml +++ b/mods/ra2/chrome.yaml @@ -1552,6 +1552,7 @@ lobby-bits: spawn-claimed: 5, 5, 22, 22 spawn-disabled: 5, 5, 22, 22 # TODO: Needs new artwork! admin: 64, 5, 7, 5 + bot: 170, 51, 16, 16 # TODO: Needs new artwork! colorpicker: 5, 5, 22, 22 huepicker: 71, 0, 7, 15 kick: 134, 0, 11, 11 @@ -1886,3 +1887,15 @@ dropdown-separators: separator: Inherits: button + +# TODO: This is a placeholder. +editor: + Image: buttons.png + Regions: + select: 51, 144, 16, 16 + tiles: 0, 144, 16, 16 + overlays: 17, 144, 16, 16 + actors: 34, 68, 16, 16 + tools: 34, 144, 16, 16 + history: 136, 51, 16, 16 + erase: 67, 144, 16, 16 diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index bdb55a8f7..baf99b67f 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -1,8 +1,6 @@ Metadata: Title: mod-title - Description: The Soviet Union is back!\nThis time to conquer the United States... Version: {DEV_VERSION} - Author: the RA2 mod team WindowTitle: mod-windowtitle ModCredits: @@ -55,7 +53,7 @@ FileSystem: ContentInstallerFileSystem MapFolders: ra2|maps: System - ~^maps/ra2/{DEV_VERSION}: User + ~^SupportDir|maps/ra2/{DEV_VERSION}: User Rules: ra2|rules/proxy-actors.yaml From 316ae3da9cc2f3abfe4b3094f3938673179a67d9 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Thu, 24 Apr 2025 20:32:22 +0300 Subject: [PATCH 19/21] Updated the CREDITS/AUTHORS file --- mods/ra2/{CREDITS => AUTHORS} | 9 +++++---- mods/ra2/mod.yaml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) rename mods/ra2/{CREDITS => AUTHORS} (74%) diff --git a/mods/ra2/CREDITS b/mods/ra2/AUTHORS similarity index 74% rename from mods/ra2/CREDITS rename to mods/ra2/AUTHORS index 6534b58a6..cf3aca791 100644 --- a/mods/ra2/CREDITS +++ b/mods/ra2/AUTHORS @@ -1,9 +1,10 @@ -The current maintainer of the ra2 mod is: +The current maintainers of the ra2 mod are: * Lukas Franke (abcdefg30) +* Matthias Mailänder (Mailaender) +* Pavel Penev (penev92) Former maintainers: * Taryn Hill (Phrohdoh) -* Matthias Mailänder (Mailaender) Also thanks to: * 4StarGeneral @@ -25,5 +26,5 @@ Also thanks to: * tomsons26 * torleif -Special thanks to the AUTHORS of OpenRA for -making it possible to recreate Red Alert 2 +Special thanks to the AUTHORS of OpenRA for +making it possible to recreate Red Alert 2 diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index baf99b67f..c176d27c0 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -5,7 +5,7 @@ Metadata: ModCredits: ModTabTitle: Red Alert 2 - ModCreditsFile: ra2|CREDITS # TODO rename to AUTHORS as stated in the .cs files when OpenRA#17460 is available + ModCreditsFile: ra2|AUTHORS PackageFormats: Mix, AudioBag From 110f94cd076217cce7b968e19b80af4621ffc75f Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 6 May 2025 11:43:33 +0300 Subject: [PATCH 20/21] Removed spurious multi.mix package reference Apparently it contained multiplayer maps, but we don't install it anyway. --- mods/ra2/mod.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ra2/mod.yaml b/mods/ra2/mod.yaml index c176d27c0..7c9261746 100644 --- a/mods/ra2/mod.yaml +++ b/mods/ra2/mod.yaml @@ -20,7 +20,6 @@ FileSystem: ContentInstallerFileSystem ContentPackages: ra2.mix language.mix - multi.mix audio.mix cache.mix cameo.mix From 40786c2d1386249d75b76ff3b236a14e4c756117 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 6 May 2025 15:46:43 +0300 Subject: [PATCH 21/21] Reimport map The Alamo To stop it from crashing due to a fence at the top tile row that is being projected outside the map bounds. --- mods/ra2/maps/the-alamo/map.bin | Bin 43217 -> 52097 bytes mods/ra2/maps/the-alamo/map.png | Bin 17272 -> 15624 bytes mods/ra2/maps/the-alamo/map.yaml | 938 +++++++++++++++---------------- 3 files changed, 469 insertions(+), 469 deletions(-) diff --git a/mods/ra2/maps/the-alamo/map.bin b/mods/ra2/maps/the-alamo/map.bin index ecf451681ac5dc331966d3c342d466625d0509ad..e4d1a7a5b247fa10216b411259d500c16d537305 100644 GIT binary patch delta 1649 zcmeHG-Aj{U6yG!3+?#KEoi=qYr^A?2v-y#f_~KS(F=>@dgdoU@D2U=M1kJv*pt3LB z4v}WHX?4?8>(E8eogjJD#E|GJDT+X(Pl#^nywAI}w|^nJI_Gzu-}#;Mobx=hv&O-j zS(35EaMfTl7z{H942Hx-j41OgVLQYC6d5Ml?J%&t0-vxo42EPk449le7|5={@+{Ba z!JQoqAk~X_XW7a>2beG&W-vxtk0cim1CM0WX;hJM&_Y#)Bs;{F3h*}z(4CV9WrB#g z%eOKZr4$Nccg_I@cQrr^Grkn}FiMfJ!Ai=ib648OoyRt^;}qDJN6rmJj@l%g%kN_F zR1`_07Ax&kG7TaH{aSubQIF=FbxXA8`@P*SOj z)nKr+T&vAB+Hk7O%C8$WnsDB|KU2P`T-VFQY8?KzWTcTgilsI((&$9T`gT47zQmEnJUp|3^ONyQh*zvqSq*0RrV%#Q?WS|JFZ6bDUYGH6ycF`krrGhRHtpd)qW*#Dq z8K#4|Xl*0S^nLbj(cNces}9r!bzrPr2iUd@V6PzQ@xhBiJJfp2P_RS7sSvF-tv|ax z!-a{CBJjD)a5Ch?<2!vB)855Blo{N$qLsYF~cQf0xo zLXR@mYXW&xOD`SMx{z*t;c{%8v*EjD@#Afei4LAqSMNAM?e6E~2ktN2(@MO!uO*W( NPCv-W!niWZegl#dl+XYG delta 973 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 X$3U$VpM_